MySQL索引优化之不适合构建索引及索引失效的几种情况详解

MySQL索引优化是提高MySQL查询效率的重要手段之一。然而,在实际应用中,我们会遇到不适合构建索引、索引失效等问题,从而造成查询效率的下降。本文将针对这些问题进行详细讲解。

一、不适合构建索引的情况

1.1 数据量太小

当表中的数据行数过少时,构建索引的意义不大,反而会增加查询开销。因此,在数据量较少的情况下,我们不建议构建索引。一般认为,数据量超过1000行时,才有必要构建索引。

1.2 索引列重复率过高

如果索引列中的重复率较高,那么建立索引就不太划算了。比如,如果一个表中有一个名为“gender”的列,只包含“男”和“女”两个值,那么对其建立索引就无意义。因为在这种情况下,大部分查询只能返回“男”或“女”,而这两个值几乎已经占了整个表的一半。因此,建立索引对查询的优化作用大打折扣。

1.3 查询条件中使用了函数、表达式等

当查询条件中使用了函数、表达式等,会导致MySQL无法使用索引加速查询。比如,下面的查询语句:

SELECT * FROM student WHERE YEAR(birthday) = 1990;

这条语句中使用了YEAR函数,会导致MySQL无法使用索引,因为无法对函数的结果建立索引。因此,我们需要对查询条件进行调整,改写成可以使用索引的形式,比如:

SELECT * FROM student WHERE birthday BETWEEN '1990-01-01' AND '1990-12-31';

二、索引失效的情况

2.1 WHERE条件中使用了!=或<>操作符

如果查询条件中使用了!=或<>操作符,MySQL就无法使用索引优化查询。因为在这种情况下,MySQL需要扫描整张表才能确定哪些行符合查询条件。比如:

SELECT * FROM student WHERE age != 18;

这条语句中,如果age列建立了索引,MySQL将不会使用该索引优化查询。

2.2 WHERE条件中使用了IS NULL或IS NOT NULL操作符

如果查询条件中使用了IS NULL或IS NOT NULL操作符,MySQL同样无法使用索引优化查询。因为在这种情况下,MySQL需要扫描整张表才能确定哪些行符合查询条件。比如:

SELECT * FROM student WHERE name IS NULL;

这条语句中,如果name列建立了索引,MySQL将不会使用该索引优化查询。

2.3 LIKE操作符以通配符开头

如果查询条件中使用了LIKE操作符,并且以通配符(%或_)开头,MySQL同样无法使用索引优化查询。因为在这种情况下,MySQL需要扫描整张表才能确定哪些行符合查询条件。比如:

SELECT * FROM student WHERE name LIKE '%jack';

这条语句中,如果name列建立了索引,MySQL将不会使用该索引优化查询。

示例1:

假设我们有一张用户反馈表feedback,其中有一个status列记录反馈状态,只有两个值:0表示未处理,1表示已处理。现在要查询所有未处理的反馈:

SELECT * FROM feedback WHERE status = 0;

由于status列的值仅有两种,如果建立索引,可以极大地提高查询效率。

示例2:

假设我们有一张订单表order,其中有一个create_time列记录订单创建时间。现在要查询2019年8月所有的订单:

SELECT * FROM order WHERE create_time BETWEEN '2019-08-01 00:00:00' AND '2019-08-31 23:59:59';

由于使用了BETWEEN操作符,可以将该查询转化为范围查询,可以使用create_time列上的索引优化查询。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL索引优化之不适合构建索引及索引失效的几种情况详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 细说SQL Server中的视图

    当我们需要获取数据库表数据的子集而不想更改表结构时,可以使用SQL Server中的视图(View)。视图是一个虚拟表,它没有自己的数据,而是从基本表中使用SELECT语句取回数据。本文将详细讲解SQL Server中视图的创建、使用以及性能考虑。 1. 视图的创建 1.1 创建基本表 在创建视图之前,我们需要首先创建一个基本表。以下是创建一个简单用户表的示…

    database 2023年5月21日
    00
  • mysql数据库日志binlog保存时效问题(expire_logs_days)

    MySQL数据库中有一个重要的日志文件类型就是binlog(二进制日志),它记录了MySQL服务器所有的写操作,包括insert、update、delete等操作。但是由于二进制日志的文件会不断增大,占据服务器存储空间,因此我们需要对其进行管理,实现自动清理。 expire_logs_days是MySQL服务器参数之一,用于配置二进制日志文件的保存时间,即指…

    database 2023年5月22日
    00
  • Mysql联合查询UNION和Order by同时使用报错问题的解决办法

    当在MySQL中使用联合查询UNION以及Order by排序时,可能会遇到以下错误: #1221 – Incorrect usage of UNION and ORDER BY 这是因为UNION和Order by语句是有限制的,不能在同一个查询中同时使用。不过这个问题可以通过以下两种方式来解决: 解决方法一:将UNION查询结果作为子查询进行排序 这种方…

    database 2023年5月22日
    00
  • sql优化实战 把full join改为left join +union all(从5分钟降为10秒)

    SQL优化是提高数据库性能的重要手段之一,本文将详细讲解如何通过将FULL JOIN改为LEFT JOIN + UNION ALL的方式,将查询时间从5分钟降为10秒。 什么是FULL JOIN? FULL JOIN是一种关联查询方式,它会返回左右两个表中所有的记录,即使没有匹配的记录也会被显示出来。在SQL语句中,FULL JOIN可以通过“FULL OU…

    database 2023年5月19日
    00
  • Consider defining a bean of type ‘redis.clients.jedis.JedisPool’ in your configuration.

    报错信息   原因是没有Jedispool没有注入 import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.Ob…

    Redis 2023年4月12日
    00
  • centos 7安装mysql5.5和安装 mariadb使用的命令

    安装 MySQL 5.5 首先,我们需要在 CentOS 7 中安装 remi-release 和 epel-release 源。 yum install epel-release yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm 接着,我们需要启用 remi 源中…

    database 2023年5月22日
    00
  • [Redis-CentOS7]Redis设置连接密码(九)

    设置Redis密码 修改/etc/redis.conf 一定要强密码redis为内存存储 抗暴力破解强 requirepass password 重启服务 systemctl restart redis 登录redis # redis-cli 127.0.0.1:6379> set username ‘leoshi’ (error) NOAUTH Au…

    Redis 2023年4月13日
    00
  • OLEDB和ODBC的区别(优缺点)

    OLEDB和ODBC的区别 OLEDB全称为Object Linking and Embedding Database,ODBC全称为Open Database Connectivity。两者都是使用数据库API进行数据访问,但是它们有以下几个区别: ODBC是基于C语言开发的,而OLEDB是基于COM技术开发的。 ODBC只能访问关系型数据库,而OLEDB…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部