mysql選擇性 Mysql索引的選擇性

2021-10-18 11:48:38 字數 1442 閱讀 6686

對於索引的使用,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...