四时宝库

程序员的知识宝库

MySQL索引,查询中like '%abc%' 能用索引吗?

无法使用索引!

MySQL 中,如果 LIKE '%abc%',是以 % 开头的,都将无法利用索引,会导致全表扫描。

但如果是 LIKE 'abc%' 则可以使用索引。

如何优化以上这种查询?

1. 全文索引

全文索引可以查找文本中的关键词,需要对应版本的支持,且只适用于 Char、Varchar或Text

2. 改变数据结构

可以考虑将需要查询的字段,将特定的前缀作为单独的一列存储,这样就可以建立索引进行检索

3. 第三方搜索引擎

常用的 Elasticsearch,支持复杂的文本查询

还有其他哪些常用的索引类型?

索引的本质是一个有序的指针集合,指向存储在磁盘上的数据。mysql 有很多类型的索引,每种索引也适用于不同的场景。

1. B-Tree 索引

使用B-Tree结构来存储键值对,其中键是索引列的值,值是指向数据行的指针。B-Tree索引可以支持范围查询、排序、分组等操作,但是对于非前缀匹配的查询效率较低。

2. Hash 索引

一种基于哈希表的索引类型,使用哈希函数将索引列的值映射到一个固定长度的哈希值,然后将哈希值和指针存储在哈希表中。Hash索引可以支持等值查询,查询速度很快,但是不能支持范围查询、排序、分组等操作,也不能利用索引缓存。

3. Full-Text 索引

是一种专门用于全文检索的索引类型,它使用倒排索引的方式来存储文本数据中的词语和出现位置。Full-Text索引可以支持模糊匹配、同义词、停用词等功能,适用于搜索引擎等应用场景。

建立索引有哪些原则?

  1. 在经常需要搜索的列上增加索引,比如 where 后面的条件,注意还要遵循最左原则

2. 在使用左外连接的列上建立索引

3. 高频查询的列,可以减少全表扫描的次数

4. 避免在频繁更新或删除的列上建立索引

5. 避免在大量重复值的列上创建索引

建立索引后还是慢的可能原因

首先查询慢有很多因素,除了本身的SQL外,还受服务器等多个因素影响。

1. 索引选择不合适

有时候,数据库优化器可能会选择一个不是最优的索引来执行查询,导致性能下降。这种情况下,可以尝试使用 hint 强制指定一个更合适的索引,或者调整索引的设计和统计信息。如果数据库没有建立正确的索引,查询可能需要遍历整个表,这会导致查询大数据量时会非常慢。可以在经常使用 Where、Order By 的列上创建索引。

2. 索引过多或过少

索引并不是越多越好,也不是越少越好。过多的索引会增加数据库的维护成本,影响数据的插入、更新和删除操作。过少的索引会导致查询无法充分利用索引,而进行全表扫描或全索引扫描。因此,需要根据查询的特点和频率,合理地创建和删除索引。

3. 查询条件不利于索引

有些查询条件会导致索引失效,例如使用了函数、表达式、隐式类型转换、逻辑非等操作。这些操作会使得数据库无法正确地利用索引的顺序和范围,而进行全表扫描或全索引扫描。因此,需要尽量避免这些操作,或者改写查询条件。如果你的 Sql 较为复杂,尤其是多表连接、子查询或复杂的 Where 条件语句都会导致查询缓慢。可以尝试将复杂的 Sql 分解为多个简单的查询。

4. 数据库参数设置不合理

数据库有一些参数会影响查询的执行计划和性能,例如优化器模式、并行度、缓存大小等。如果这些参数设置不合理,可能会导致查询选择了一个低效的执行计划,或者无法充分利用数据库的资源。因此,需要根据数据库的实际情况,合理地调整这些参数。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接