對於索引的使用,mysql並不一直都是用採用正確的決定的。
參考乙個簡單的表:
create table `r2` (
`id` int(11) default null,
`id1` int(11) default null,
`cname` varchar(32) default null,
key `id1` (`id1`)
) engine=myisam default charset=latin1
select count(*) from r2;
250001 (v1)
select count(*) from r2 where id1=1;
83036 (v2)
(execution time = 110 ms)
(id1=1)條件查詢索引的選擇性是 v2/v1 = 0.3321 或 33.21%
一般來說(例如書 「sql tuning「),如果選擇性超過 20% 那麼全表掃瞄比使用索引效能更優。
我知道oracle一直是在選擇性超過25%時會選擇全表掃瞄。
而mysql呢:
mysql> explain select count(subname) from r2 where id1=1;
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
| 1 | ****** | t2 | ref | id1 | id1 | 5 | const | 81371 | using where |
這就是mysql將會使用索引來完成這個查詢。
select count(subname) from t2 where id1=1 - 410 ms
select count(subname) from t2 ignore index (id1) where id1=1 - 200 ms
如你所看到全表掃瞄要快2倍。
select cnt2 / cnt1 from (select count(*) cnt1 from r2) d1, (select count(*) cnt2 from r2 where id1=1) d2;
0.9492 = 94.92%;
說明mysql將會用索引來完成查詢。
select count(subname) from t2 where id1=1 - 1200 ms
select count(subname) from t2 ignore index (id1) where id1=1 - 260 ms
這次全表掃瞄要快4.6倍。
為什麼mysql選擇索引訪問查詢?
mysql沒有計算索引的選擇性,只是**邏輯io操作的數量,並且我們的例子中間的邏輯io數量,索引訪問要少於全表掃瞄。
所以對索引要小心使用,它們並不是能幫助所有的查詢。
MySQL建立字首索引和索引選擇性
天忽作晴山卷慢,雲猶含態石披衣 什麼是字首索引 一般情況下,如果需要作為索引的那一列長度很長.就需要使用字首索引來節約索引控制項.即只需要為前面幾個字元作為索引.什麼是索引選擇性 索引選擇性是指,不重複的索引值 也稱為基數 和資料表的記錄總數 t 的比值,範圍從1 t到1之間.索引選擇性越高則查詢效...
MySQL索引之字首索引和索引選擇性
有時需要索引很長的字元列,它會使索引變大而且變慢。乙個策略就是模擬雜湊索引。但是有時這也不夠好,那?通常可以索引開始的幾個字元,而不是全部值,以節約空間並得到好的效能。這使索引需要的空間變小,但是也會降低選擇性。索引選擇性是不重複的索引值 和表中所有行的比值。高選擇性的索引有好處,因為它使mysql...
MySQL索引之字首索引和索引選擇性
有時需要索引很長的字元列,它會使索引變大而且變慢。乙個策略就是模擬雜湊索引。但是有時這也不夠好,那?通常可以索引開始的幾個字元,而不是全部值,以節約空間並得到好的效能。這使索引需要的空間變小,但是也會降低選擇性。索引選擇性是不重複的索引值 和表中所有行的比值。高選擇性的索引有好處,因為它使mysql...