乾貨!SQL性能優化,書寫高質量SQL語句(二)

標題乾貨!SQL性能優化,書寫高質量SQL語句(二)

點點贊 不迷路 文末領取博主精心爲大家準備的面試渡劫大禮包
在這裏插入圖片描述
本片博文承接上一篇 《乾貨!SQL性能優化,書寫高質量SQL語句》。這裏非常感謝大家,很給面子,評論區給了很多意見和指導!上篇文章出現太多的理論知識,並沒有用具體的測試用例說服大家,那麼本片乾貨分享主要針對上篇掘友們提出的疑問點進行回答,提供詳細的測試用例。如有不足還請賜教~

數據庫版本 mysql 5.7.26

1. where語句使用 IN 到底走不走索引?

首先先創建一張測試表

CREATE TABLE `student` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(255) NOT NULL,
  `class` varchar(255) DEFAULT NULL,
  `page` bigint(20) DEFAULT NULL,
  `status` tinyint(3) unsigned NOT NULL COMMENT '狀態:0 正常,1 凍結,2 刪除',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4

批量新增100w條數據

DELIMITER ;;
    CREATE PROCEDURE insertData()
    BEGIN
        declare i int;
        set i = 1 ;
        WHILE (i < 1000000) DO
            INSERT INTO student(`name`,class,`page`,`status`)
                VALUES(CONCAT('class_', i),
                    CONCAT('class_', i),
                i, (SELECT FLOOR(RAND() * 2)));
            set i = i + 1;
        END WHILE;
        commit;
		END;;
CALL insertData();

name 字段 不加 索引,進行測試, 耗時 0.8s

SELECT * FROM student WHERE `name` IN
('class_1','class_100','class_1000','class_100000');

name 字段加索引後,測試耗時 0.021s

SELECT * FROM student WHERE `name` IN
('class_1','class_100','class_1000','class_100000');

在這裏插入圖片描述

那麼我們發現where 語句使用 IN 是走索引的

但是!如果數據量過大(百萬級別),例如估計爲全表80%,那麼是不會走索引的,會走全表掃描!

再查一下 student 表中的 status 字段 in 的情況

SELECT * FROM student WHERE `status` IN(0,2);

加索引後,因爲數據量大,並未走索引,如圖所示:

在這裏插入圖片描述
總結

翻閱大量資料進行測試,如果是mysql5.5之前的版本,確實是不會走索引的,在5.5及之後的版本中,MySql做了優化,在2010年發佈的5.5版本中,優化器對 IN 操作符可以自動完成優化,針對建立了索引的列可以使用索引,沒有索引的列還是會走全表掃描,但是如果數據量大,例如估計爲全表80%,會走全表掃描

2.where子句中使用 IS NULL 或 IS NOT NULL 到底走不走索引?

我們分三種情況來測試

  • 索引列 name 默認值爲 NULL 允許爲空
  • 索引列 name 默認值爲 ‘1’ 允許爲空
  • 索引列 name 默認值爲 ‘1’ 不允許爲空

1.索引列 name 默認值爲 NULL 允許爲空

在這裏插入圖片描述

SELECT * FROM student WHERE `name` is not null

在這裏插入圖片描述

SELECT * FROM student WHERE `name` is null


分析: IS NULL 使用了索引 , IS NOT NULL 沒有走索引

2.索引列 name 默認值爲 ‘1’ 允許爲空


在這裏插入圖片描述

分析: IS NULL 使用了索引 , IS NOT NULL 沒有走索引

3.索引列 name 默認值爲 ‘1’ 不允許爲空


分析: IS NULL 沒有走索引 , IS NOT NULL 也沒有走索引

結論

is not null不管字段是否爲空都不會走索引,is null在字段允許爲空時會使用索引!

結語

好了,本文到這裏節結束啦,希望對大家有所幫助,如果有任何疑問,歡迎評論區留言
最後 : 小編在這裏給大家分享一份 2019年多家公司java面試題整理120多頁pdf文檔的PDF,希望大家在之後的面試中和技術提升能夠事半功倍,需要的朋友們點贊評論喔~

羣號:530720915 點擊加入 進羣驗證“csdn” 獲取
在這裏插入圖片描述

最後
歡迎大家一起交流,整理資料不易,喜歡文章記得點個讚唄,感謝支持!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章