前些時候在學習MySQL 索引的時候,看不少人的博客說查詢條件中是 is null ,is not null ,<> 的狀況, 索引會失效,我本人沒試,索引信覺得真,後來別人提醒下,本身親自測試了一下, 果真它是走索引的,因此不能盲目相信網上的博客,在此記錄一下。sql
我這裏有一張杆塔信息表,表結構信息如圖,數據結構
CREATE TABLE `src_tower_info` ( `tower_id` varchar(50) NOT NULL COMMENT '杆塔ID', `tower_name` varchar(100) DEFAULT NULL COMMENT '杆塔名稱', `tower_code` int(11) DEFAULT NULL COMMENT '杆塔號', `line_id` varchar(50) DEFAULT NULL COMMENT '線路ID', `region` varchar(10) DEFAULT NULL COMMENT '地區', `parent_region` varchar(10) DEFAULT NULL COMMENT '父地區', `maintainer` varchar(100) DEFAULT NULL COMMENT '供電公司', `altitude` varchar(50) DEFAULT NULL COMMENT '海拔', `height` varchar(20) DEFAULT NULL COMMENT '高度', `terrain` varchar(50) DEFAULT NULL COMMENT '地形', `stationmap_1` double(20,10) DEFAULT NULL COMMENT '經度', `stationmap_2` double(20,10) DEFAULT NULL COMMENT '緯度', `dilei` varchar(10) DEFAULT NULL COMMENT '地類', `whdj` varchar(10) DEFAULT NULL COMMENT '危害等級', `design_ice_thickness` varchar(20) DEFAULT NULL COMMENT '設計覆冰厚度', `design_wind_speed` varchar(20) DEFAULT NULL COMMENT '設計風速', `jyzinfo` varchar(10) DEFAULT NULL COMMENT '絕緣子信息', `padianbiju` varchar(20) DEFAULT NULL COMMENT '爬電比距', `loopnum` varchar(50) DEFAULT NULL COMMENT '迴路數', `tower_property` varchar(20) DEFAULT NULL COMMENT '杆塔類型(耐張,直線)', `installwave` varchar(10) DEFAULT NULL COMMENT '是否有防舞動裝置(是,否)', `resistance_design_value` varchar(50) DEFAULT NULL COMMENT '接地電阻設計值', `zblx` int(5) DEFAULT NULL COMMENT '植被類型', `windspan` varchar(50) DEFAULT NULL COMMENT '水平檔距', `is_valid` bit(1) DEFAULT NULL COMMENT '是否有效(0:有效;1:無效)', `invalid` varchar(400) DEFAULT NULL COMMENT '字段有、無效標識(0:有效;1:無效)', `invalid_model` varchar(40) DEFAULT NULL COMMENT '數據無效的模型(以","分隔)', `create_at` timestamp NULL DEFAULT NULL COMMENT '天鷹庫入庫時間', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立時間', `update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時間', PRIMARY KEY (`tower_id`), UNIQUE KEY `line_tower_id__unique` (`line_id`,`tower_id`) USING BTREE, KEY `index_tower_name` (`tower_name`) USING BTREE, KEY `index_tower_code` (`tower_code`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='(臺帳)杆塔信息表';
表中建有一個名字爲 index_tower_code 的二級索引,tower_code 字段能夠爲空。咱們本次就是用這個字段來作實驗。oop
首先咱們查詢tower_code 爲空的數據一共有多少條,學習
SELECT COUNT(tower_id) FROM src_tower_info where tower_code is NULL
查詢顯示共1093條測試
咱們用explain 查詢此SQL的執行過程。spa
執行過程顯示 此SQL查詢使用了index_tower_code 這個索引。設計
同理,測試了is not null , <> 也使用了索引。code
MySQL中索引通常以B+樹數據結構保存數據,二級索引葉子節點中保存的是主鍵值,索引按從小到大的順序排列。當二級索引列爲null時,節點值最小,位於最左側,查詢爲null的的時候從最左側取直到第一個不爲null的節點返回。blog