尽管 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'),但是最终你'