索引那些事

2021-09-12 15:44:23 字數 3666 閱讀 8001

最近面試問了很多關於索引的事,本來自認為可以對答如流,什麼btree  b+tree啊,什麼like '%abc'和like 『abc%』的區別啊,又是聯合索引a=? and b=? and c=?的判斷啊,很簡單吶,但沒想到啊,這裡面門門道道都可以玩出花來了,現在面試官問問題都是挖著陷阱讓你往裡跳,不講究。

你真的懂聯合索引麼?

話不多說,實踐出真理,建表建索引 (name,class,age)

create table `newtable` (

`id` int(11) not null auto_increment ,

`name` varchar(255) character set utf8 collate utf8_general_ci null default null ,

`class` varchar(255) character set utf8 collate utf8_general_ci null default null ,

`age` int(11) null default null ,

`weight` double null default null ,

primary key (`id`),

index `name_class_age_index` (`name`, `class`, `age`) using btree

)engine=innodb

default character set=utf8 collate=utf8_general_ci

auto_increment=4

row_format=dynamic

;

地球人都知道用到了索引,且key_len最大,也就是索引全用到了

同理,name=?  and class=?  也用到了索引,只不過key_len要小一點

這裡跳了乙個class,能用到索引麼,答案是可以的,其實只要查詢條件帶了name,就一定用到了索引。

觀察key_len=768    如果不寫age=?呢,還是768。

所以沒寫class=?  導致後面的索引都失效了

前者當然用到了索引,那後者呢?class可是寫在前面耶,這不符合聯合索引的前置原則吧

然而事實是也用到了索引,因為mysql會自動優化sql語句!!!

由於沒用到name    自然沒有用到索引

為了少貼些圖,我直接寫結果了

is null  和 =  沒區別

is not null  後面的引用失效,如果name is not null  則全部失效

explain select * from studentindex where name='123' and  class is  null and  age=22    

--1541

explain select * from studentindex where name='123' and class ='123' and age is not null

--1541

explain select * from studentindex where name='123' and class is not null and age is not null

--1536 is not null 之後的引用全失效了

explain select * from studentindex where name is not null and class is not null and age is not null

-- alltype name is not null 直接掃瞄全表了

比較符號仍然呼叫引用,且和順序無關

explain select * from studentindex where name='123' and  class ='123' and  age <123

-- 1541

explain select * from studentindex where name='123' and class ='123' and age >123

-- 1541

explain select * from studentindex where name='123' and age >123 and class ='123'

-- 1541

全部失效

explain select * from studentindex where name='123' and  age != 123 and  class ='123' 

-- all type

explain select * from studentindex where name like '123%'  and  class like '123%' and  age = 123

-- 1541 like 'abc%' 和 = 一樣的意思

explain select * from studentindex where name like '123%' and class not like '123%' and age = 123

-- 768 not like 自身不起作用 且以後的也沒作用

explain select * from studentindex where name like '123%' and class like '%123' and age = 123

-- 768 like '%abc' 和 not like 一樣

explain select * from studentindex where name  like '123%'  or  class  like '1234' and  age = 123

-- all type or 導致索引失效

explain select * from studentindex where name like '123%' and (class like '1234' or age = 123)

-- 768 or 導致括號內部索引失效

索引 mysql MySql索引那些事

概述一 什麼是索引 資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。就像我們以前用的新華字典的目錄一樣,能幫助我們快速查詢到某乙個字。二 索引的分類 分類角度索引名稱 資料結構b 樹,hash索引,r tree等 儲存層面聚簇索引,非聚簇索引 邏輯層面主鍵索引,...

MySql索引那些事

it技術之家 2019 04 03 16 32 16 概述一 什麼是索引 資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。就像我們以前用的新華字典的目錄一樣,能幫助我們快速查詢到某乙個字。二 索引的分類 分類角度索引名稱 資料結構b 樹,hash索引,r tre...

mysql索引做什麼 MySQL索引那些事

概述一 什麼是索引 資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。就像我們以前用的新華字典的目錄一樣,能幫助我們快速查詢到某乙個字。二 索引的分類 分類角度 索引名稱 資料結構 b 樹,hash索引,r tree等 儲存層面 聚簇索引,非聚簇索引 邏輯層面 主...