高性能 MySQL 中索引的问题?

2018-07-14 07:24:58 +08:00
 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 后面改了
4144 次点击
所在节点    MySQL
16 条回复
zooo
2018-07-14 07:26:15 +08:00
执行结果:后一条,查询到了数据,没有使用索引,而前一条使用没有查询到数据,使用了索引。
haiyang416
2018-07-14 07:29:12 +08:00
看样子是覆盖索引相关的内容,需要确认两条查询里都是 last_name ?
zooo
2018-07-14 07:41:00 +08:00
@haiyang416 刚看了下,书上 说 : 如果一个索引包含(或者说覆盖)所有需要查询的字段的值,就称为覆盖索引。
但我这里 查询 * 还包括了 gerder 字段,那就应该不是覆盖索引了吧?
haiyang416
2018-07-14 07:48:45 +08:00
@zooo 我的意思是检查下两条查询条件是不是都是 last_name,有没有 first_name,看是不是左前匹配。覆盖索引是说书的章节,估计记错了,请忽略。
pathbox
2018-07-14 08:40:42 +08:00
你数据是怎样的没有说
zooo
2018-07-14 08:59:17 +08:00
@pathbox 和数据量和数据内容有关系?不懂,求教
zooo
2018-07-14 09:00:13 +08:00
@haiyang416 查询条件都是 WHERE last_name
glacer
2018-07-14 09:04:11 +08:00
应该是你的数据里没有 A 开头的,我记得要是没有命中索引的数据,执行计划是显示全表的。
carlclone
2018-07-14 09:08:21 +08:00
和数据量跟内容会有关系,涉及到优化器的东西,比如表太小直接就顺序查找,不走索引
eslizn
2018-07-14 09:12:50 +08:00
不存在的,看看你的 Extra
Raymon111111
2018-07-14 20:34:58 +08:00
区分度的问题

比如你数据库里几乎所有的数据都 A****, 那走不走 A 这个索引对查询几乎毫无帮助, 那么就会直接判定不走这个索引了
zooo
2018-07-14 20:43:24 +08:00
@glacer A 开头的有 8 条,没有走索引,而 J 开头的没有数据,走索引了。

@Raymon111111 嗯,之前也有人这么说,那应该是这样了,A***数据占数据表大部分,所以就不用走索引的
Raymon111111
2018-07-14 21:05:51 +08:00
@zooo 数据太少了, 至少几万再想索引的事吧
zooo
2018-07-14 21:18:13 +08:00
zooo
2018-07-14 21:18:24 +08:00
谢谢各位回答
xiaoxlm
2018-07-15 17:47:27 +08:00
查询优化器会根据数据量判断要不要用索引

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

https://www.v2ex.com/t/470792

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

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

© 2021 V2EX