返回顶部
首页 > 资讯 > 数据库 >导致MySQL索引失效的一些常见写法总结
  • 127
分享到

导致MySQL索引失效的一些常见写法总结

mysql索引mysql索引使用mysql组合索引失效 2022-05-16 07:05:33 127人浏览 独家记忆
摘要

前言 最近一直忙着处理原来老项目遗留的一些sql优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致Mysql的CPU资源飙升,基于此,给大家简单分享下这些比较使用的易于学习和使用

前言

最近一直忙着处理原来老项目遗留的一些sql优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致Mysql的CPU资源飙升,基于此,给大家简单分享下这些比较使用的易于学习和使用的经验。

这次的话简单说下如何防止你的索引失效。

再说之前我先根据我最近的经验说下我对索引的看法,我觉得并不是所以的表都需要去建立索引,对于一些业务数据,可能量比较大了,查询数据已经有了一点压力,那么最简单、快速的办法就是建立合适的索引,但是有些业务可能表里就没多少数据,或者表的使用频率非常不高的情况下是没必要必须要去做索引的。就像我们有些表,2年了可能就10来条数据,有索引和没索引性能方面差不多多少。

索引只是我们优化业务的一种方式,千万为了为了建索引而去建索引。

下面是我此次测试使用的一张表结构以及一些测试数据


CREATE TABLE `user` (
 `id` int(5) unsigned NOT NULL AUTO_INCREMENT,
 `create_time` datetime NOT NULL,
 `name` varchar(5) NOT NULL,
 `age` tinyint(2) unsigned zerofill NOT NULL,
 `sex` char(1) NOT NULL,
 `mobile` char(12) NOT NULL DEFAULT '',
 `address` char(120) DEFAULT NULL,
 `height` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_createtime` (`create_time`) USING BTREE,
 KEY `idx_name_age_sex` (`name`,`sex`,`age`) USING BTREE,
 KEY `idx_ height` (`height`) USING BTREE,
 KEY `idx_address` (`address`) USING BTREE,
 KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=261 DEFAULT CHARSET=utf8;

INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (1, '2019-09-02 10:17:47', '冰峰', 22, '男', '1', '陕西省咸阳市彬县', '175');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (2, '2020-09-02 10:17:47', '松子', 13, '女', '1', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (3, '2020-09-02 10:17:48', '蚕豆', 20, '女', '1', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (4, '2020-09-02 10:17:47', '冰峰', 20, '男', '17765010977', '陕西省西安市', '155');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (255, '2020-09-02 10:17:47', '竹笋', 22, '男', '我测试下可以储存几个中文', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (256, '2020-09-03 10:17:47', '冰峰', 21, '女', '', NULL, '167');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (257, '2020-09-02 10:17:47', '小红', 20, '', '', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (258, '2020-09-02 10:17:47', '小鹏', 20, '', '', NULL, '188');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (259, '2020-09-02 10:17:47', '张三', 20, '', '', NULL, '180');INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (260, '2020-09-02 10:17:47', '李四', 22, '', '', NULL, '165');

单个索引

1、使用!= 或者 <> 导致索引失效


SELECT * FROM `user` WHERE `name` != '冰峰';

我们给name字段建立了索引,但是如果!= 或者 <> 这种都会导致索引失效,进行全表扫描,所以如果数据量大的话,谨慎使用

可以通过分析SQL看到,type类型是ALL,扫描了10行数据,进行了全表扫描。<>也是同样的结果。

2、类型不一致导致的索引失效

在说这个之前,一定要说一下设计表字段的时候,千万、一定、必须要保持字段类型的一致性,啥意思?比如user表的id是int自增,到了用户的账户表user_id这个字段,一定、必须也是int类型,千万不要写成varchar、char什么的骚操作。


SELECT * FROM `user` WHERE height= 175;

这个SQL诸位一定要看清楚,height表字段类型是varchar,但是我查询的时候使用了数字类型,因为这个中间存在一个隐式的类型转换,所以就会导致索引失效,进行全表扫描。

现在明白我为啥说设计字段的时候一定要保持类型的一致性了不,如果你不保证一致性,一个int一个varchar,在进行多表联合查询(eg: 1 = '1')必然走不了索引。

遇到这样的表,里面有几千万数据,改又不能改,那种痛可能你们暂时还体会。

少年们,切记,切记。

3、函数导致的索引失效


SELECT * FROM `user` WHERE DATE(create_time) = '2020-09-03';

如果你的索引字段使用了索引,对不起,他是真的不走索引的。

运算符导致的索引失效


SELECT * FROM `user` WHERE age - 1 = 20;

如果你对列进行了(+,-,*,/,!), 那么都将不会走索引。

OR引起的索引失效


SELECT * FROM `user` WHERE `name` = '张三' OR height = '175';

OR导致索引是在特定情况下的,并不是所有的OR都是使索引失效,如果OR连接的是同一个字段,那么索引不会失效,反之索引失效。

模糊搜索导致的索引失效


SELECT * FROM `user` WHERE `name` LIKE '%冰';

这个我相信大家都明白,模糊搜索如果你前缀也进行模糊搜索,那么不会走索引。

NOT IN、NOT EXISTS导致索引失效


SELECT s.* FROM `user` s WHERE NOT EXISTS (SELECT * FROM `user` u WHERE u.name = s.`name` AND u.`name` = '冰峰')

SELECT * FROM `user` WHERE `name` NOT IN ('冰峰');

这两种用法,也将使索引失效。但是NOT IN 还是走索引的,千万不要误解为 IN 全部是不走索引的。我之前就有误解(丢人了...)。

IS NULL不走索引,IS NOT NULL走索引


SELECT * FROM `user` WHERE address IS NULL

不走索引。


SELECT * FROM `user` WHERE address IS NOT NULL;

走索引。

根据这个情况,建议大家这设计字段的时候,如果没有必要的要求必须为NULL,那么最好给个默认值空字符串,这可以解决很多后续的麻烦(有深刻的体验<体验=教训>)。

符合索引

最左匹配原则


EXPLaiN SELECT * FROM `user` WHERE sex = '男';

EXPLAIN SELECT * FROM `user` WHERE name = '冰峰' AND sex = '男';

测试之前,删除其他的单列索引。

啥叫最左匹配原则,就是对于符合索引来说,它的一个索引的顺序是从左往右依次进行比较的,像第二个查询语句,name走索引,接下来回去找age,结果条件中没有age那么后面的sex也将不走索引。

注意:


SELECT * FROM `user` WHERE sex = '男' AND age = 22 AND `name` = '冰峰';

可能有些搬砖工可能跟我最开始有个误解,我们的索引顺序明明是name、sex、age,你现在的查询顺序是sex、age、name,这肯定不走索引啊,你要是自己没测试过,也有这种不成熟的想法,那跟我一样还是太年轻了,它其实跟顺序是没有任何关系的,因为mysql的底层会帮我们做一个优化,它会把你的SQL优化为它认为一个效率最高的样子进行执行。所以千万不要有这种误解。

2、如果使用了!=会导致后面的索引全部失效


SELECT * FROM `user` WHERE sex = '男' AND `name` != '冰峰' AND age = 22;

我们在name字段使用了 != ,由于name字段是最左边的一个字段,根据最左匹配原则,如果name不走索引,后面的字段也将不走索引。

关于符合索引导致索引失效的情况能说的目前就这两种,其实我觉得对于符合索引来说,重要的是如何建立高效的索引,千万不能说我用到那个字段我就去建立一个单独的索引,不是就可以全局用了嘛。这样是可以,但是这样并没有符合索引高效,所以为了成为高级的搬砖工,我们还是要继续学习,如何创建高效的索引。

总结

到此这篇关于导致MySQL索引失效的一些常见写法的文章就介绍到这了,更多相关MySQL索引失效的常见写法内容请搜索自学编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持自学编程网!

您可能感兴趣的文档:

--结束END--

本文标题: 导致MySQL索引失效的一些常见写法总结

本文链接: https://lsjlt.com/news/9793.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 导致MySQL索引失效的一些常见写法总结
    前言 最近一直忙着处理原来老项目遗留的一些SQL优化问题,由于当初表的设计以及字段设计的问题,随着业务的增长,出现了大量的慢SQL,导致MySQL的CPU资源飙升,基于此,给大家简单分享下这些比较使用的易于学习和使用...
    99+
    2022-05-16
    mysql 索引 mysql索引使用 mysql组合索引失效
  • 哪些情况会导致 MySQL 索引失效
    目录前言创建测试表和数据索引失效情况1:非最左匹配索引失效情况2:错误模糊查询索引失效情况3:列运算索引失效情况4:使用函数索引失效情况5:类型转换索引失效情况6:使用 is not...
    99+
    2024-04-02
  • MySQL导致索引失效的情况有哪些
    本篇内容主要讲解“MySQL导致索引失效的情况有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL导致索引失效的情况有哪些”吧!一、准备工作首先准备两张表用于演示:CREATE&nbs...
    99+
    2023-07-02
  • MySQL导致索引失效的几种情况
    目录一、准备工作二、索引失效规则1.优先使用联合索引2.最左匹配原则3.范围条件右边的列索引失效4.计算、函数导致索引失效5.类型转换导致索引失效6.不等于(!= 或者<>)索引失效7.is null可以使用...
    99+
    2022-06-23
    Mysql 索引失效
  • mysql索引失效的常见原因有哪些
    本篇内容介绍了“mysql索引失效的常见原因有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言:MySQL中提高性能的一个最有效的方式...
    99+
    2023-06-30
  • 浅谈mysql哪些情况会导致索引失效
    下面有一些培训教学机构的口诀和我个人的一些总结: 为了讲解以下索引内容,我们先建立一个临时的表 test02 CREATE TABLE `sys_user` ( `id` v...
    99+
    2024-04-02
  • MySQL中索引失效的常见场景与规避方法
    前言 之前有看过许多类似的文章内容,提到过一些sql语句的使用不当会导致MySQL的索引失效。还有一些MySQL“军规”或者规范写明了某些sql不能这么写,否则索引失效。 绝大部分的内容笔者是认可的,不...
    99+
    2024-04-02
  • MySQL隐式类型转换导致索引失效的解决
    目录问题 复现 隐式转换 总结 参考 问题 在工作中发现,有一个接口只执行一条SQL查询语句,并且SQL明明使用了主键列,但是速度很慢。 在MySQL中EXPLAINN后发现,执行...
    99+
    2024-04-02
  • MySQL索引知识的一些小妙招总结
    一、索引基本知识 1.1 索引的优点 大大减少了服务器需要扫描的数据量,加快数据库的检索速度 帮助服务器避免排序和临时表 将随机io变成顺序io 1.2 索引的用处 速查找...
    99+
    2022-05-23
    mysql 索引 mysql索引结构 mysql索引技巧
  • mysql索引失效的常见九种原因图文详解
    目录前言:1.最佳左前缀法则3.计算、函数、类型转换(自动或手动)导致索引失效4.范围条件右边的列索引失效5.不等于(!= 或者<>)导致索引失效6.is null可以使...
    99+
    2024-04-02
  • MySQL远程无法连接的一些常见原因总结
    目录前言原因1:原因2:原因3:总结前言 mysql是目前非常流行的数据库之一,也是中小企业持久化存储的首选数据库。 不同于我们日常学习,在实际应用中,MySQL服务都会挂载在某台服务器上。如果MySQL部署在某台云服务...
    99+
    2024-04-02
  • oracle分区表全局唯一索引失效导致无法增删改怎么办
    这篇文章主要为大家展示了“oracle分区表全局唯一索引失效导致无法增删改怎么办”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“oracle分区表全局唯一索引失效...
    99+
    2024-04-02
  • MySQL索引的一些常见面试题大全(2022年)
    目录为什么要建立索引?哪些情况适合建立索引?那么哪些情况下适合建索引?哪些情况下不适合建索引?为什么索引是使用B+树?(重点)索引分为那几类?什么是聚簇索引?(重点)使用聚簇索引的优缺点?(知道)为什么推荐使用自增主键作...
    99+
    2023-02-17
    MySQL常见面试题 数据库索引面试题 mysql怎么使用索引查询
  • Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法
    这篇文章主要介绍了Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的解决方法,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了...
    99+
    2024-04-02
  • Excel数据导入Mysql常见问题汇总:如何处理特殊字符导致导入失败的问题?
    Excel数据导入MySQL常见问题汇总:如何处理特殊字符导致导入失败的问题?导入数据到MySQL是一个常见且重要的操作,但在实际操作中,你可能会遇到一些问题。其中之一就是特殊字符导致导入失败的情况。本文将为你介绍一些常见的问题及其解决方法...
    99+
    2023-10-22
    特殊字符处理 Excel数据导入 错误导入处理
  • mysql索引失效的原因及解决方法有哪些
    MySQL索引失效的原因及解决方法有以下几个方面:1. 索引选择不当:MySQL根据查询的条件和数据分布情况来选择使用哪个索引。如果查询的条件与索引不匹配或者数据分布不均匀,就会导致索引失效。解决方法是优化查询语句,使用合适的索引。2....
    99+
    2023-08-09
    mysql
  • Mysql 5.6 "隐式转换"导致的索引失效和数据不准确的问题
    背景 在一次进行SQl查询时,我试着对where条件中vachar类型的字段去掉单引号查询,这个时候发现这条本应该很快的语句竟然很慢。这个varchar字段有一个复合索引。其中的总条数有58989,甚...
    99+
    2022-05-17
    Mysql 5.6隐式转换导致的索引失效 Mysql 5.6隐式转换
  • 【总结】一些可能导致PHP无法启动的原因和解决方案
    PHP是一种热门的服务器端脚本语言,被广泛使用于Web开发,因其简单易学、灵活性高、具有跨平台性等特点而备受开发者青睐。但是有时候,您可能会遇到php不能启动的问题。本文将带您查明无法启动php的原因,并提供一些解决方案,以确保您的php脚...
    99+
    2023-05-14
    php
  • Excel数据导入Mysql常见问题汇总:如何解决导入日期格式不一致的问题?
    Excel数据导入Mysql常见问题汇总:如何解决导入日期格式不一致的问题?在进行数据导入时,经常会遇到Excel中日期格式与Mysql数据库中日期格式不一致的情况。这种问题的出现可能导致数据导入失败或者数据显示出错。本文将介绍一些解决这一...
    99+
    2023-10-22
    Excel MySQL 导入
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作