多列索引

  多列索引對查詢的影響
  假定你發出下列SELECT語句:
    mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;
  若是一個多列索引存在於col1和col2上,適當的行能夠直接被取出。
  若是分開的單行列索引存在於col1和col2上,優化器試圖經過決定哪一個索引將找到更少的行並來找出更具限制性的索引而且使用該索引取行。
  你能夠這樣建立一個多列索引:
    mysql>ALTER TABLE tbl_name ADD INDEX(col1,col2);
  而你應該這樣建立分開的單行列索引:
    mysql>ALTER TABLE tble_name ADD INDEX(col1);
    mysql>ALTER TABLE tble_name ADD INDEX(col1); 
  若是表有一個多列索引,任何最左面的索引前綴能被優化器使用以找出行。例如,若是你有一個3行列索引(col1,col2,col3),你已經索引了在(col1)、(col1,col2)和(col1,col2,col3)上的搜索能力。
  若是列不構成索引的最左面前綴,MySQL不能使用一個部分的索引。
  假定你下面顯示的SELECT語句:
  mysql> SELECT * FROM tbl_name WHERE col1=val1;
  mysql> SELECT * FROM tbl_name WHERE col2=val2;
  mysql> SELECT * FROM tbl_name WHERE col2=val2 AND col3=val3; 
  若是一個索引存在於(col一、col二、col3)上,只有上面顯示的第一個查詢使用索引。
  第二個和第三個查詢確實包含索引的列,可是(col2)和(col二、col3)不是(col一、col二、col3)的最左面前綴。mysql

 

  若是LIKE參數是一個不以一個通配符字符起始的一個常數字符串,MySQL也爲LIKE比較使用索引。
  例如,下列SELECT語句使用索引:
    mysql> select * from tbl_name where key_col LIKE "Patrick%";
    mysql> select * from tbl_name where key_col LIKE "Pat%_ck%"; 
  在第一條語句中,只考慮有"Patrick" <= key_col < "Patricl"的行。在第二條語句中,只考慮有"Pat" <= key_col < "Pau"的行。sql

 

  下列SELECT語句將不使用索引:
    mysql> select * from tbl_name where key_col LIKE "%Patrick%";
    mysql> select * from tbl_name where key_col LIKE other_col; 
  在第一條語句中,LIKE值以一個通配符字符開始。在第二條語句中,LIKE值不是一個常數。
  若是 column_name 是一個索引,使用column_name IS NULL的搜索將使用索引。優化

 

參考:http://blog.csdn.net/tsuliuchao/article/details/4877157spa

相關文章
相關標籤/搜索