高性能 MySQL 中索引的问题?

2018 年 7 月 14 日
 zooo

CREATE TABLE People (
last_name VARCHAR(50) NOT NULL,
first_name VARCHAR(50) NOT NULL,
dob DATE NOT NULL,
gender ENUM('m', 'f') NOT NULL,
KEY(last_name, first_name, dob)
);
EXPLAIN SELECT * FROM high_performance_mysql.People WHERE last_name LIKE 'J%';
EXPLAIN SELECT * FROM high_performance_mysql.People WHERE last_name LIKE 'A%';
为什么这两个查询语句,一个使用到了索引,一个没有使用索引? 仅仅就是 LIKE 后面改了
4919 次点击
所在节点    MySQL
16 条回复
zooo
2018 年 7 月 14 日
执行结果:后一条,查询到了数据,没有使用索引,而前一条使用没有查询到数据,使用了索引。
haiyang416
2018 年 7 月 14 日
看样子是覆盖索引相关的内容,需要确认两条查询里都是 last_name ?
zooo
2018 年 7 月 14 日
@haiyang416 刚看了下,书上 说 : 如果一个索引包含(或者说覆盖)所有需要查询的字段的值,就称为覆盖索引。
但我这里 查询 * 还包括了 gerder 字段,那就应该不是覆盖索引了吧?
haiyang416
2018 年 7 月 14 日
@zooo 我的意思是检查下两条查询条件是不是都是 last_name,有没有 first_name,看是不是左前匹配。覆盖索引是说书的章节,估计记错了,请忽略。
pathbox
2018 年 7 月 14 日
你数据是怎样的没有说
zooo
2018 年 7 月 14 日
@pathbox 和数据量和数据内容有关系?不懂,求教
zooo
2018 年 7 月 14 日
@haiyang416 查询条件都是 WHERE last_name
glacer
2018 年 7 月 14 日
应该是你的数据里没有 A 开头的,我记得要是没有命中索引的数据,执行计划是显示全表的。
carlclone
2018 年 7 月 14 日
和数据量跟内容会有关系,涉及到优化器的东西,比如表太小直接就顺序查找,不走索引
eslizn
2018 年 7 月 14 日
不存在的,看看你的 Extra
Raymon111111
2018 年 7 月 14 日
区分度的问题

比如你数据库里几乎所有的数据都 A****, 那走不走 A 这个索引对查询几乎毫无帮助, 那么就会直接判定不走这个索引了
zooo
2018 年 7 月 14 日
@glacer A 开头的有 8 条,没有走索引,而 J 开头的没有数据,走索引了。

@Raymon111111 嗯,之前也有人这么说,那应该是这样了,A***数据占数据表大部分,所以就不用走索引的
Raymon111111
2018 年 7 月 14 日
@zooo 数据太少了, 至少几万再想索引的事吧
zooo
2018 年 7 月 14 日
zooo
2018 年 7 月 14 日
谢谢各位回答
xiaoxlm
2018 年 7 月 15 日
查询优化器会根据数据量判断要不要用索引

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/470792

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX