Mysql 存儲引擎的區別以及索引查詢失效的情況


存儲引擎:就是指表在計算機上的存儲方式。可以通過 SHOW ENGINES; 命令查詢支持的存儲引擎。

alter table test engine= innodb/memory/myisam/archive;

InnoDB 只有InnoDB支持事務存儲
InnoDB 支持自動增長列的主鍵,以及外鍵
InnoDb 支持頻繁的更新與刪除
InnoDB 讀寫效率差,佔用的空間大

MyISAM 曾經是Mysql的默認存儲引擎,不支持事務,不支持外鍵
MyISAM 鎖級別爲表鎖,INSERT和UPDATE操作需要鎖定整個表
MyISAM 因爲它保存了表的行數,當使用COUNT統計時不會掃描全表;

MEMORY 存儲的表結構以frm的形式保存在硬盤上,數據全部在內存中
MEMORY 默認是以Hash作爲索引,速度比使用B型樹索引快。(也可以改爲B型樹索引)
MEMORY 生命週期短

Archive 以zlib的格式對數據進行壓縮, 數據存儲在arz的後綴文件中。 Archive表比MyISAM表要小大約75%,比InnoDB表小大約83%
Archive 不允許有索引與主鍵
Archive 只允許插入與查詢
Archive 表比其他任何類型的表執行的物理I/O操作都要少。性能最高


mysql 引起索引失效的條件:
表一:
CREATE TABLE `user` (
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`),
KEY `index_name` (`name`),
KEY `index_age` (`age`),
KEY `index_address` (`address`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

表二:
CREATE TABLE `job` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) DEFAULT NULL,
`job` varchar(255) DEFAULT NULL,
`name` varchar(25) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_index` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=42 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

 

1,單表查詢時,使用了 OR 條件索引失效
explain SELECT name,age,address FROM user where name = '光頭強' or age = 20

2,like查詢是以'%'開頭(以%結尾是可以使用索引的)
explain SELECT name,age,address FROM user where name like '%頭強'

3,對查詢的列上有運算或者函數的
explain SELECT name,age,address FROM user where substr(name,-2)='頭強'
explain SELECT name,age,address FROM user where age+1=12

4,如果列類型是字符串,那一定要在條件中將數據使用引號引用起來,否則不使用索引
explain SELECT name,age,address FROM user where name = 10

5,左連接查詢或者右連接查詢查詢關聯的字段編碼格式不一樣(並且字符串長度必須一樣)
EXPLAIN select a.name,b.name,b.job
from
user a
left JOIN job b
ON a.name =b.name

6、如果mysql估計使用全表掃描要比使用索引快,則不使用索引
EXPLAIN select a.name,b.name,b.job
from
user a
left JOIN job b
ON a.name =b.name

7、連接查詢中,按照優化器順序的第一張表不會走索引
EXPLAIN select a.name,a.age,b.name,b.job
from
user a
left JOIN job b
ON a.name =b.name

8、如果查詢中沒有用到聯合索引的第一個字段,則不會走索引

 

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