Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么“像'a%'这样的WHERE col”可以使用索引,而不是“像'%a%'这样的WHERE col”?_Mysql_Sql_Indexing - Fatal编程技术网

Mysql 为什么“像'a%'这样的WHERE col”可以使用索引,而不是“像'%a%'这样的WHERE col”?

Mysql 为什么“像'a%'这样的WHERE col”可以使用索引,而不是“像'%a%'这样的WHERE col”?,mysql,sql,indexing,Mysql,Sql,Indexing,我刚找到这篇帖子: 我很想了解亚萨的帖子,他说: 我不希望从客户那里选择代码“%a%” 很快,因为它不可能使用索引。每一张唱片都必须 选中的。考虑从客户那里选择“一%”的代码 这是可能的,因为这可能会使用索引 有人能解释一下这两个select语句之间的区别吗?我知道一个人只有一个通配符,只能找到以a开头的东西。但是,为什么可以将其编入索引?来自: 大多数MySQL索引主键、唯一、索引和全文都存储在B树中。在使用=、>、>=、的表达式中,B-tree索引可用于列比较,尽管MySQL的B-tree索

我刚找到这篇帖子:

我很想了解亚萨的帖子,他说:

我不希望从客户那里选择代码“%a%” 很快,因为它不可能使用索引。每一张唱片都必须 选中的。考虑从客户那里选择“一%”的代码 这是可能的,因为这可能会使用索引

有人能解释一下这两个select语句之间的区别吗?我知道一个人只有一个通配符,只能找到以a开头的东西。但是,为什么可以将其编入索引?

来自:

大多数MySQL索引主键、唯一、索引和全文都存储在B树中。在使用=、>、>=、的表达式中,B-tree索引可用于列比较,尽管MySQL的B-tree索引的类型比这更复杂,但对于大多数目的来说,在列上有一个索引足以让MySQL引擎在表上执行选择,就好像它是由该列排序的一样

如果代码列上有一个索引,并且您正在搜索代码为“a%”的记录,那么所有MySQL或任何其他SQL包,只要它足够聪明,就可以从“a”开始到“b”开始吐出所有记录。但是,如果要搜索代码为“%a%”的记录,那么让表已经按代码排序对您没有帮助,因为行是否匹配where子句与其在索引中的位置没有简单的关系。因此,对于第二个查询,数据库除了检查表中每一行的代码项的每个字符外,没有其他合理的操作,除非它已经缓存了结果

这很容易直观地理解,因为你可以想象自己作为一个人做一些相当类似的事情。如果你想在《牛津英语词典》中找到所有以“a”开头的单词,那么你只需浏览从“a”开始到“b”开始的所有页面,你所看到的一切都是以“a”开头的单词。如果你想在字典里的任何地方找到所有带“a”的单词,那么订购的字典对你没有多大帮助。如果你足够老练,你可以合理地利用字典的顺序,比如利用你的知识,字典中第一个“b…”之前的所有单词都包含一个“a”,但最终你必须查看几乎每个单词。

MySQL使用索引

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


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

我认为这里的问题不是是否可以为列编制索引,而是索引是否将实际用于特定查询。
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';