mysql 多列索引優化


Mysql所有的列都可以使用索引,。對相關列使用索引是提高SELECT操作性能的最佳途徑。根據存儲引擎定義每個表的最大索引數和最大索引長度。所有存儲引擎支持每個表至少16個索引,總索引長度至少256字節。在索引中使用col_name(length)語法,可以創建一個只使用char和archar列的第一個length個字符的索引,按這種方式只索引列的前綴可以索引文件小的多。MyISAm和INNODb存儲引擎還支持對blob和text列的索引,但是必須指定索引長度。fulltext索引用於全文搜索不支持局部索引。

 

多列索引:

     Mysql可以創建多列索引,一個索引支持15個列,多列索引對於多條件查詢很有幫助。多列索引可以看做是通過連接索引列的值而創建的值的排序的數組。

    Mysql按這樣的方式使用多列索引:當在WHERE子句為索引的第一個列指定已知的數量時查詢很快,即使沒有指定其他列的值。

  CREATE INDEX suoyin ON Table (col1,col2)

suoyin索引是對於col1和col2的索引,索引可以用於col1,或者是col1,col2在已知范圍指定值的查詢。

  select * FROM test where col1='where';

select * from test where col1='where1' AND col2="where2";

select * from test where col1='where1' AND (col2='where1' OR col2='where3');

select * from test where col1='where1' AND col2 >='where1' AND col2 < 'where3';

但是多列索引不用與下邊的查詢:

   select * from test WHERE col2 = 'where';

select * from test where col1='where1' OR col2 = 'where3';

 

mysql 如何使用索引:

    索引用於快速找出在某一個列中有一特定值的行。不使用索引,mysql必須從第一條記錄開始然后讀完整個表直到找出相關的行,表越大,花費的時間越大。如果表中查詢的列有索引,Mysql不必查看所有的數據,快速達到一個位置去搜索數據。大多數mysql索引在B樹中存儲。。

索引用於下面的操作

  快速找出匹配一個WHERE子句的行。

刪除時。

執行聯接查詢從其它表檢索時

對具體的有索引的列找出max,min。

對一個可用關鍵字進行排序分組。

當使用

SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;

如果表有一個多列索引,優化器可以使用最左面的索引前綴來找出行。例如,如果有一個3列索引(col1,col2,col3),則已經對(col1)、(col1,col2)和(col1,col2,col3)上的搜索進行了索引
如果列不構成索引最左面的前綴,mysql不能使用局部索引。index(col1,col2,col3)

select * from table where col1=val1;

select * from table where col1=val1 AND col2=val2;

select * froom table where col2=val2;不使用索引

select * from table where col2=val2 and col3=val3; 不實用索引

SELECT * FROM Table WHERE col1=val1 OR col2=val2; 不實用索引。

也可以在表達式通過=、>、>=、<、<=或者BETWEEN操作符使用B-樹索引進行列比較。如果LIKE的參數是一個不以通配符開頭的常量字符串,索引也可以用於LIKE比較。

 like 'partten%';使用索引

like 'parrtn%sf%'; 使用索引

like '%parrtn';不實用索引,因為以%開頭使用不了索引值的前綴。

like other_col 不使用索引因為不是一個常量值。

如果列是被索引的,那么 col_name is NULL 的搜索也會使用索引。

任何不跨越 WHERE子句中的所有 AND級的索引不用於優化查詢,也就是為了能夠使用索引,必須在每個AND組中使用所有索引的前綴。

下邊的使用索引:

  where index_part1 = val1 AND index_part2=val2;

where index1=val1 OR index2=val2 AND index3=val3;這里的列都是索引前綴或是單列索引。

下邊的不實用索引:

  where index_part2 = val2 AND|OR index_part3=val3;沒使用索引前綴。

where index-part1 =val1 OR index_part2=val2;沒有索引跨越所有行

wher index_part1 AND a='A' 索引中不使用WHERE子句的兩部分

Hash索引還有一些其它特征:

  它們只用於使用=或<=>操作符的等式比較(但很快)。它們用於比較 操作符,例如發現范圍值的<。

優化器不能使用hash索引來加速ORDER BY操作

MySQL不能確定在兩個值之間大約有多少行(這被范圍優化器用來確定使用哪個索引)。如果你將一個MyISAM表改為hash-索引的MEMORY表,會影響一些查詢

只能使用整個關鍵字來搜索一行。(用B-樹索引,任何關鍵字的最左面的前綴可用來找到行


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM