MySQL COUNT語句的索引使用

2021-10-25 02:24:37 字數 2140 閱讀 6148

我們先準備好測試資料

create

table user_test_count

( id int

primary

keynot

null

auto_increment

, name varchar(45

),age int

, email varchar(60

),birthday date

)engine

'innodb'

;insert

into user_test_count (id, name, age, email, birthday)

values(1

,'張三',20

,'[email protected]'

,'2000-01-01');

insert

into user_test_count (id, name, age, email, birthday)

values(2

,'李四',30

,'[email protected]'

,'1990-01-01');

insert

into user_test_count (id, name, age, email, birthday)

values(3

,'王五',40

,null

,null);

insert

into user_test_count (id, name, age, email, birthday)

values(4

,'趙六',50

,null

,null

);

我們先直接使用count(*)

explain

select

count(*

)from user_test_count;

可以看到key使用了主鍵

然後我們給email字段新增乙個索引

我們再次執行上述explain語句,可以看到這次使用了email的索引,key_len長度為243

然後我們再新增乙個birthday欄位的索引

執行上述explain語句,這次使用了birthday的索引,key_len長度為4

由此我們可以得出以下結論:

當沒有非主鍵索引時,會使用主鍵索引

如果存在非主鍵索引的話,會使用非主鍵索引

如果存在多個非主鍵索引,會使用乙個最小的非主鍵索引

其原因是:在innodb中,非主鍵索引葉子節點儲存的結構是:索引+主鍵;主鍵索引葉子節點是:主鍵+表資料。在1個page裡面,非主鍵索引可以儲存更多的條目,例如:

對於一張表,如果有1000000資料,使用非主鍵索引掃瞄的page數可能是100 ,而使用主鍵索引page數可能是500,此時使用非主鍵索引的效能會更好。同理如果存在多個非主鍵索引,會使用乙個最小的非主鍵索引,也是為了在乙個page裡儲存更多的資料,從而減少掃瞄次數,提高效能。

我們可以再試一下單字段的count

explain

select

count

(email)

from user_test_count;

可以看到還是撞在email的索引上

說明:count(字段)只會針對該欄位統計,使用這個字段上面的索引

mysql count 幾種寫法時間的比較

mysql 資料庫有一張表,資料量是6800w條,現在使用count 對資料進行統計 1.首先看下mysql的表結構 create table business dict url id int 11 not null auto increment,company name varchar 100 d...

百萬行mysql,count 函式的思考與總結

如果你的需要是統計總行數時,為什麼要使用count 而避免使用指定具體的列名?count 函式裡面的引數是列名的的時候,那麼會計算這個欄位有值項的次數。也就是,該欄位沒有值的項並不會進入計算範圍 就是網上常說的值為null的項不納入統計 很多地方都有類似表述 count column counts ...

mysql索引語句 mysql建立索引語句格式

專案需要將某個表的某兩個字段新增唯一索引,保證這兩個欄位的值不能同時重複。alter table 表名 add unique index 索引名 欄位1,欄位2 當表中已經存在重複資料的時候,新增的時候就會報錯,這時候需要將資料去重。1 先查出來重複的資料 select from select 字段...