我們先準備好測試資料
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
,'2000-01-01');
insert
into user_test_count (id, name, age, email, birthday)
values(2
,'李四',30
,'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 字段...