IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁數(shù)據(jù)庫MYSQL → 你可能不知道的MySQL

你可能不知道的MySQL

時(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)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦10款MySQL數(shù)據(jù)庫客戶端圖形界面管理工具推薦MySQL常用維護(hù)管理工具MySQL常用維護(hù)管理工具Linux VPS/服務(wù)器上輕松導(dǎo)入、導(dǎo)出MySQL數(shù)據(jù)Linux VPS/服務(wù)器上輕松導(dǎo)入、導(dǎo)出MySQL數(shù)據(jù)MySQL復(fù)制的概述、安裝、故障、技巧、工具MySQL復(fù)制的概述、安裝、故障、技巧、工具

相關(guān)下載

人氣排行 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)方法