2

我刚找到这个帖子:

对于 5000 条记录的表,类似 MySQL 的查询运行速度极慢

我有兴趣了解 asaph 的帖子,他说:

我不希望 select * from customer 像 '%a%' 这样的代码会很快,因为它不可能使用索引。必须检查每条记录。如果可能,请考虑 select * from customer where code like 'a%',因为这可能会使用索引。

有人可以解释两个选择语句之间的区别吗?我知道一个人只有一个通配符,只会找到以“a”开头的东西。但为什么那个可以被索引?

4

3 回答 3

5

尽管 MySQL 的 B-tree 索引的实际细节比这更复杂,但对于大多数用途来说,在列上创建索引可以让 MySQL 引擎SELECT在您的表上执行 s,就好像它是按该列排序的一样。

如果该code列上有一个索引,并且您正在搜索记录 where code LIKE 'a%',那么所有 MySQL(或任何其他 SQL 包,只要它足够聪明)所要做的就是从 'a 的开头吐出所有记录' 到 'b' 的开头。但是,如果您正在搜索 where 记录code LIKE '%a%',那么已经对表进行排序code将无济于事,因为行是否匹配 WHERE 子句与其在索引中的位置没有简单的关系。code所以对于第二个查询,除了检查表中每一行的条目的每个字符(除非它已经缓存了结果)之外,数据库无法合理地做任何事情。

这很容易直观地理解,因为您可以想象自己作为人类做一些相当相似的事情。如果你想在牛津英语词典中找到所有以'a'开头的单词,那么你只需浏览从'a'开头到'b'开头的所有页面,所有你看到的都是一个单词以“a”开头。如果您想在字典中的任何位置找到所有带有“a”的单词,那么被排序的字典不会为您提供太多帮助。如果你足够老练,你可以合理地利用字典的顺序例如,利用你的知识,字典中第一个 'b...' 单词之前的所有单词都包含一个 'a'),但是最终你'

于 2013-03-07T21:38:32.443 回答
3

手册

大多数 MySQL 索引(PRIMARY KEYUNIQUEINDEXFULLTEXT)都存储在 B 树中。B 树索引可用于使用=>>=<<=BETWEEN运算符的表达式中的列比较。以下SELECT语句不使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';

LIKE如果参数 toLIKE是不以通配符开头的常量字符串,则索引也可用于比较。例如,以下SELECT 语句使用索引:

SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';
于 2013-03-07T21:36:05.643 回答
2

MySQL 使用BTREE索引。

如果您使用带有前导通配符的 LIKE 进行字符串比较,那么 MySQL 执行表扫描会更快,因为索引不能用于缩小结果范围。

如果您使用带有尾随通配符的 LIKE 进行字符串比较,那么使用索引会更快,因为需要扫描的记录更少。

于 2013-03-07T21:41:01.370 回答