MySQL 中查詢條件是is null ,is not null ,<> 是否走索引

前些時候在學習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

相關文章
相關標籤/搜索