Mysql數據庫索引IS NUll ,IS NOT NUll ,!= 是否走索引

聲明在前面

總結就是 不能單純說 走和不走,須要看數據庫版本,數據量等 ,但願不要引發你們的誤會,也不要被標題黨誤導了。mysql

1 數據庫版本:sql

2 建表語句數據庫

CREATE TABLE s1 ( id INT NOT NULL AUTO_INCREMENT, key1 VARCHAR(200), key2 VARCHAR(200), key3 VARCHAR(200), key_part1 VARCHAR(200), key_part2 VARCHAR(200), key_part3 VARCHAR(200), common_field VARCHAR(200), PRIMARY KEY (id) ) ENGINE=INNODB CHARSET=utf8;

3 建索引語句app

CREATE INDEX isz_key1 ON s1(key1); CREATE INDEX isz_key2 ON s1(key2); CREATE INDEX isz_key3 ON s1(key3); CREATE INDEX idx_key_part ON s1 (key_part1, key_part2, key_part3);

4 鋪底數據測試

DELIMITER $$ CREATE PROCEDURE pre () BEGIN DECLARE i INT; SET i = 0; WHILE i < 9000 DO INSERT INTO s1 ( key1, key2, key3, key_part1, key_part2, key_part3, common_field ) VALUES ( 'a', '注意應收熱熱帳款狀態爲有效狀態下,應收帳款編號與應熱熱付流水號一一對應,(已結傭、已熱熱、已失效3種狀況爲無效熱熱,其餘均爲有效狀態)', 'cc', 'a應收帳款狀態爲a', 'cc', '注意應erect帳款狀態爲有效狀態下,應收帳款編號與應付流水號一一對應,(已結傭、已熱熱無效、已失效3種狀況爲熱熱狀態,其餘均爲有效狀態)', 'ddff' ); SET i = i + 1; END WHILE; END $$ CALL pre (); DROP PROCEDURE pre;
select COUNT(
1)FROM s1;

IS NULL ,IS NOT NUll 是否走索引

  

  EXPLAIN SELECT *FROM s1 WHERE s1.`key1` IS NULL; 表裏 key1 爲is null的總數爲0 查詢is null 走索引優化

EXPLAIN SELECT *FROM s1 WHERE s1.`key1` IS not NULL; 表裏 key1 的列 is not null 的總數爲0,不存在值爲null 查詢is not null 不走索引 spa

 Is null count爲19012條 ,is not count爲9條 實驗結果 is null 和 is not null 都走索引3d

   測試application 表,is null count有305條,表總有324條 ,is null 不走索引code

  

  總結 並非 is null ,is not null走和不走索引是和數據量或者和其餘元素有關係(這裏我只是測試到和數據量有關係) sql優化器在執行的時候會計算成本,其實和基數,選擇性,直方圖有關,其實就是看你所搜索的部分佔全表的比例是走索引仍是全表成本低。blog

 

!=走索引嗎?

<> 和!= 是同一個意思 ,都是不等於

測試一  <> 走索引,存在<>的數據量有9條

 測試二<>走索引存在不等於的數據量有305條

    測試三 <> 不走索引 值都是「abc」,不是「abc」的總條數爲0

 SELECT COUNT(1)FROM s1 WHERE s1.`key3` ='abc'; -- 0

  測試四 <>走索引

  總結:並不能一句話說 走和不走,須要看條件,好比數據量,等於「abc」的數據量和不等於「abc」的量,mysql在執行的時候會判斷走索引的成本和全表掃描的成本,而後選擇成本小的那個

相關文章
相關標籤/搜索