mysql索引失效的十大问题小结

MySQL索引是优化查询性能的重要手段,但是有时候即使建立了索引也可能出现索引失效的情况。下面是MySQL索引失效的十大问题:

1. 查找NULL值

MySQL的B-Tree索引不适用于查找NULL值,如果查询条件是IS NULL或者IS NOT NULL时,MySQL必须扫描全表。可以使用覆盖索引和联合索引来优化这个问题。

2. 使用函数或者表达式进行计算

如果在WHERE或者ORDER BY语句中使用函数或者表达式进行计算,MySQL就无法使用索引,需要将函数或者表达式移动到索引外部,将计算结果存储在一个新的列中,并为这个新列建立索引。

例如,查询订单表中金额大于1000的记录:

SELECT *
FROM orders
WHERE price * quantity > 1000;

可以改写成:

ALTER TABLE orders
ADD COLUMN amount DECIMAL(9,2) AS (price * quantity);

CREATE INDEX idx_amount ON orders (amount);

SELECT *
FROM orders
WHERE amount > 1000;

3. 字符串类型的列使用LIKE操作符

如果在WHERE语句中使用LIKE操作符进行模糊匹配,MySQL只有在字符串前面没有通配符的情况下才能使用索引,否则无法使用索引。

例如,查询订单表中名称以"B%"开头的记录:

SELECT *
FROM orders
WHERE name LIKE 'B%';

可以改写成:

SELECT *
FROM orders
WHERE name >= 'B' AND name < 'C';

4. 不同类型的列进行比较

如果在WHERE语句中对不同类型的列进行比较,MySQL可能无法使用索引,需要对列进行类型转换或者使用覆盖索引。

例如,查询订单表中ID为字符串类型的记录:

SELECT *
FROM orders
WHERE id = '123';

可以改写成:

SELECT *
FROM orders
WHERE id = 123;

5. 使用OR操作符连接WHERE条件

如果在WHERE语句中使用OR操作符连接条件,MySQL只有在所有条件都使用索引的情况下才能使用索引。

例如,查询订单表中ID为1或者名称为"ABC"的记录:

SELECT *
FROM orders
WHERE id = 1 OR name = 'ABC';

可以改写成:

SELECT *
FROM orders
WHERE (id = 1 AND name <> 'ABC') OR (id <> 1 AND name = 'ABC');

6. 索引列上进行函数操作

如果在索引列上使用函数操作,MySQL会放弃使用索引而进行全表扫描。

例如,查询订单表中ID加1的记录:

SELECT *
FROM orders
WHERE id + 1 = 123;

可以改写成:

SELECT *
FROM orders
WHERE id = 122;

7. 表连接中使用了非等值操作符

如果在表连接中使用了非等值操作符,MySQL可能无法使用索引,需要考虑使用覆盖索引或者索引优化。

例如,查询订单表中ID小于产品表中ID的记录:

SELECT *
FROM orders o, products p
WHERE o.id < p.id;

可以改写成:

SELECT *
FROM orders o
WHERE EXISTS (
 SELECT *
 FROM products p
 WHERE o.id < p.id
);

8. 字符串类型的排序

在MySQL中,按照字符串类型排序需要将字符串类型的列全部加载到内存中排序,如果字符串类型的列过大,会导致内存不足而使用磁盘排序,导致排序性能下降。

例如,查询订单表中名称按照字母顺序排序的记录:

SELECT *
FROM orders
ORDER BY name;

可以改写成:

SELECT *
FROM orders
ORDER BY name COLLATE utf8mb4_unicode_ci;

9. 查询结果集中的重复列

如果查询结果集中包含重复列,MySQL会将重复列读取多次,导致性能下降。

例如,查询订单表中品牌和名称相同的记录:

SELECT brand, name
FROM orders
GROUP BY brand, name
HAVING COUNT(*) > 1;

可以改写成:

SELECT o1.brand, o1.name
FROM orders o1, orders o2
WHERE o1.brand = o2.brand AND o1.name = o2.name AND o1.id < o2.id;

10. 使用ORDER BY或者GROUP BY语句的列和WHERE语句的列不一致

如果使用了ORDER BY或者GROUP BY语句的列和WHERE语句的列不一致,MySQL可能无法使用索引,需要对列进行类型转换或者使用覆盖索引。

例如,查询订单表中品牌为"XYZ"的记录,并按照名称排序:

SELECT *
FROM orders
WHERE brand = 'XYZ'
ORDER BY name;

可以改写成:

SELECT *
FROM orders
WHERE brand = 'XYZ'
ORDER BY name COLLATE utf8mb4_unicode_ci;

以上就是MySQL索引失效的十大问题,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql索引失效的十大问题小结 - Python技术站

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

相关文章

  • plsql连接oracle数据库报ora 12154错误解决方法

    PL/SQL连接Oracle数据库报ORA-12154错误的解决方法 问题描述 在使用Oracle PL/SQL Developer连接Oracle数据库时,可能会出现ORA-12154错误: ORA-12154: TNS:could not resolve the connect identifier specified 这个错误表示PL/SQL Deve…

    database 2023年5月19日
    00
  • .net中webconfig 详解

    下面是”.net中webconfig 详解”的完整攻略。 一、什么是Web.config Web.config是一个XML格式的文件,它存储着一个Web应用程序中的配置信息,如数据库连接字符串、身份验证方式、Session状态管理等等。 Web.config配置信息可以修改,可以在运行时动态修改,这样就不用重新编译整个应用程序,使得应用程序的管理更加方便。 …

    database 2023年5月21日
    00
  • Docker安装mysql超详细步骤记录

    下面是”Docker安装mysql超详细步骤记录”的完整攻略: 环境准备 在开始安装mysql之前,你需要准备好以下环境: 安装好docker环境 确保已经安装好docker-compose工具 步骤一:创建docker-compose文件 首先,我们需要创建一个名为docker-compose.yml的文件,用于定义mysql docker容器的配置信息。…

    database 2023年5月22日
    00
  • MySQL中库的基本操作指南(推荐!)

    MySQL是一种流行的开源关系型数据库管理系统,由于其使用方便、性能稳定、扩展能力强等特点,广泛被应用于各种Web应用程序中。在MySQL中,我们可以通过许多操作来管理和维护数据库,下面是一份MySQL中库的基本操作指南: 创建数据库 如果我们希望在MySQL中创建一个新的数据库,可以使用以下命令: CREATE DATABASE database_name…

    database 2023年5月22日
    00
  • mac使用mysql出现的错误 ERROR 1045 (28000): Access denied for user ‘root’@’localhost’ (using password: YES)

    1.首先第一步
停止Mysql服务 打开系统偏好设置中的mysql选择Stop Mysql Server 2:
进入终端输入:cd /usr/local/mysql/bin/
回车后; 登录管理员权限 sudo su
回车后;输入管理员对应的密码 输入以下命令来禁止mysql验证功能 ./mysqld_safe –skip-grant-tables &am…

    MySQL 2023年4月13日
    00
  • centos7下部署Redis

    1.1. Redis的安装 Redis是c语言开发的。 安装redis需要c语言的编译环境。如果没有gcc需要在线安装。yum install gcc-c++ 安装步骤: 第一步:redis的源码包上传到linux系统。 第二步:解压缩redis。 第三步:编译。进入redis源码目录。make 第四步:安装。make install PREFIX=/usr…

    Redis 2023年4月13日
    00
  • oracle 使用rownum的三种分页方式

    下面来详细讲解“Oracle 使用 ROWNUM 的三种分页方式”的完整攻略。 什么是 ROWNUM ROWNUM是Oracle中一个伪列(伪列是一个看起来像是表中某个字段、但实际上不是字段、由oracle为其预先设置了值的列),表示被检索出来的数据行的序号,起始值为1,每次增加1。 ROWNUM分页 在Oracle中使用ROWNUM进行分页,要注意结果集是…

    database 2023年5月21日
    00
  • 解析探秘fescar分布式事务实现原理

    解析探秘fescar分布式事务实现原理 分布式事务是一个难点,因为分布式事务牵涉到多个不同的计算节点之间的协作,要实现一个高效且可靠的分布式事务控制系统并不是一件容易的事。在这篇文章中,我们将讲解如何解析探秘fescar分布式事务实现原理,并通过两个示例说明其工作原理。 什么是fescar fescar是一个基于Java的分布式事务解决方案,旨在解决分布式事…

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