時(shí)間:2015/6/28來源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)
mysql> desc tbl_name;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| uid | int(11) | NO | | NULL | |
| sid | mediumint(9) | NO | | NULL | |
| times | mediumint(9) | NO | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
存儲(chǔ)引擎是MyISAM,里面有10,000條數(shù)據(jù)。
一、"\G"的作用
mysql> select * from tbl_name limit 1;
+--------+--------+-------+
| uid | sid | times |
+--------+--------+-------+
| 104460 | 291250 | 29 |
+--------+--------+-------+
1 row in set (0.00 sec)
mysql> select * from tbl_name limit 1\G;
*************************** 1. row ***************************
uid: 104460
sid: 291250
times: 29
1 row in set (0.00 sec)有時(shí)候,操作返回的列數(shù)非常多,屏幕不能一行顯示完,顯示折行,試試"\G",把列數(shù)據(jù)逐行顯示("\G"挽救了我,以前看explain語句橫向顯示不全折行看起來巨費(fèi)勁,還要把數(shù)據(jù)和列對(duì)應(yīng)起來)。
二、"Group by"的"隱形殺手"
mysql> explain select uid,sum(times) from tbl_name group by uid\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using temporary; Using filesort
1 row in set (0.00 sec)
mysql> explain select uid,sum(times) from tbl_name group by uid order by null\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using temporary
1 row in set (0.00 sec)默認(rèn)情況下,Group by col會(huì)對(duì)col字段進(jìn)行排序,這就是為什么第一語句里面有Using filesort的原因,如果你不需要對(duì)col字段進(jìn)行排序,加上order by null吧,要快很多,因?yàn)閒ilesort很慢的。
三、大批量數(shù)據(jù)插入
最高效的大批量插入數(shù)據(jù)的方法:
load data infile '/path/to/file' into table tbl_name;如果沒有辦法先生成文本文件或者不想生成文本文件,可以一次插入多行:
insert into tbl_name values (1,2,3),(4,5,6),(7,8,9)...注意一條sql語句的最大長(zhǎng)度是有限制的。如果還不想這樣,可以試試MySQL的prepare,應(yīng)該都會(huì)比硬生生的逐條插入要快許多。
如果數(shù)據(jù)表有索引,建議先暫時(shí)禁用索引:
alter table tbl_name disable keys;插入完畢之后再激活索引:
alter table tbl_name enable keys;對(duì)MyISAM表尤其有用。避免每插入一條記錄系統(tǒng)更新一下索引。
#p#副標(biāo)題#e#
四、最快復(fù)制表結(jié)構(gòu)方法
mysql> create table clone_tbl select * from tbl_name limit 0;
Query OK, 0 rows affected (0.08 sec)
只會(huì)復(fù)制表結(jié)構(gòu),索引不會(huì)復(fù)制,如果還要復(fù)制數(shù)據(jù),把limit 0去掉即可。
五、加引號(hào)和不加引號(hào)區(qū)別
給數(shù)據(jù)表tbl_name添加索引:
mysql> create index uid on tbl_name(uid);測(cè)試如下查詢:
mysql> explain select * from tbl_name where uid = '1081283900'\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ref
possible_keys: uid
key: uid
key_len: 4
ref: const
rows: 143
Extra:
1 row in set (0.00 sec)我們?cè)谡妥侄蔚闹瞪霞铀饕,是可以用到索引的,網(wǎng)上不少人誤傳在整型字段上加引號(hào)無法使用索引。修改uid字段類型為varchar(12):
mysql> alter table tbl_name change uid uid varchar(12) not null;測(cè)試如下查詢:
mysql> explain select * from tbl_name where uid = 1081283900\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: uid
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using where
1 row in set (0.00 sec)我們?cè)诓樵冎瞪喜患铀饕Y(jié)果索引無法使用,注意安全。
六、前綴索引
有時(shí)候我們的表中有varchar(255)這樣的字段,而且我們還要對(duì)該字段建索引,一般沒有必要對(duì)整個(gè)字段建索引,建立前8~12個(gè)字符的索引應(yīng)該就夠了,很少有連續(xù)8~12個(gè)字符都相等的字段。
為什么?更短的索引意味索引更小、占用CPU時(shí)間更少、占用內(nèi)存更少、占用IO更少和很更好的性能。
七、MySQL索引使用方式
MySQL在一個(gè)查詢中只能用到一個(gè)索引(5.0以后版本引入了index_merge合并索引,對(duì)某些特定的查詢可以用到多個(gè)索引,具體查考[中文] [英文]),所以要根據(jù)查詢條件建立聯(lián)合索引,聯(lián)合索引只有第一位的字段在查詢條件中能才能使用到。
如果MySQL認(rèn)為不用索引比用索引更快的話,那么就不會(huì)用索引。
mysql> create index times on tbl_name(times);
Query OK, 10000 rows affected (0.10 sec)
Records: 10000 Duplicates: 0 Warnings: 0
mysql> explain select * from tbl_name where times > 20\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: ALL
possible_keys: times
key: NULL
key_len: NULL
ref: NULL
rows: 10000
Extra: Using where
1 row in set (0.00 sec)
mysql> explain select * from tbl_name where times > 200\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: tbl_name
type: range
possible_keys: times
key: times
key_len: 3
ref: NULL
rows: 1599
Extra: Using where
1 row in set (0.00 sec)數(shù)據(jù)表中times字段絕大多數(shù)都比20大,所以第一個(gè)查詢沒有用索引,第二個(gè)才用到索引。
關(guān)鍵詞標(biāo)簽:MySQL
相關(guān)閱讀
熱門文章 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦MySQL常用維護(hù)管理工具Linux VPS/服務(wù)器上輕松導(dǎo)入、導(dǎo)出MySQL數(shù)據(jù)MySQL復(fù)制的概述、安裝、故障、技巧、工具
人氣排行 MySQL數(shù)據(jù)庫啟動(dòng)失敗1067進(jìn)程意外終止的解決辦法總結(jié)Mysql 1045錯(cuò)誤解決辦法10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦MySQL服務(wù)器進(jìn)程CPU占用100%解決辦法MySQL導(dǎo)出導(dǎo)入命令的用例MySQL無法啟動(dòng)、無法停止各種解決方法總結(jié)三種常用的MySQL建表語句Mysql清空表的實(shí)現(xiàn)方法