首页 > 数据库 >MySQL——优化(二):索引创建和失效

MySQL——优化(二):索引创建和失效

时间:2023-02-12 14:56:39浏览次数:62  
标签:name no 索引 user MySQL 失效 where select

一、创建索引的原则

1、建议创建索引的场景

  • where语句的查询条件
    • select语句,对于某些字段经常作为 where语句的查询条件;
  • Update/delete语句的where条件频繁使用时的字段
  • 需要分组、排序的字段
  • distinct所使用的字段
  • 如果字段的值,有唯一性约束,要创建唯一索引
    • 对于某些字段,要求他不能重复,比如(用户名),那么是可以创建唯一索引、主键索引的
  • 多表查询,连接字段应该创建索引,并且类型务必保持一致,避免隐式转换;
    • 隐式转换可能会导致索引无法使用;

2、不建议创建索引的场景

  • where子句中用不到的字段;
  • 表中数据非常少,是否创建索引对查询效率的影响并不大
  • 有大量重复数据,选择性低,创建索引作用不大,
    • 索引选择性越高,可以让mysql在查询时过滤更多的行,提升查询效率;比如性别sex字段,不建议创建索引
  • 频繁更新的字段
    • 如果创建索引需要考虑其索引维护开销,索引的更新维护是有开销的
    • 某一字段修改非常频繁,查询很少,不建议创建索引
 

二、索引失效场景

示例表 CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(100) COLLATE utf8_bin NOT NULL DEFAULT '', `user_no` int(11) COLLATE utf8_bin DEFAULT 0, `name_reverse` varchar(100) COLLATE utf8_bin NOT NULL DEFAULT '', `role` varchar(100) COLLATE utf8_bin DEFAULT NULL, `mobile` varchar(20) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE, KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin  

1.索引字段参加表达式计算

反例:select * from t_user where user_no +1 = 10000 解决方案:事先计算好表达式的值再传过来 正例:select * from t_user where user_no = 9999  

2.索引字段是函数的参数

反例:select * from t_user where SUBSTRING(name,1,3) = 'win' 解决方案:预先计算好结果再传过来,不使用函数;使用等价的SQL去实现 正例:select * from t_user where name like 'win%'  

3.like查询使用左模糊

反例:select * from t_user where name like '%win' 解决方案:使用搜索引擎或者增加逆向字段 正例:select * from t_user where name_reverse like 'niw%'  

4.使用or查询的部分字段没有索引

反例:select * from t_user where name ='windge' or role='程序员' 解决方案:把没有索引的字段加上索引,两个索引会各自去查询,最后进行合并 将role加上索引后,explain后 type = index_merge  

5.字符串未使用''引起来

反例:select * from t_user where role=3 解决方案:规范编写SQL,参数类型与字段类型一致 正例:select * from t_user where role='3'  

6.组合索引不符合最左前缀的查询

反例:比如只有组合索引是 index(idx_role_user_no) select * from t_user where user_no='n001' 解决方案:调整组合索引的顺序 index(idx_user_no_role) 或者独立索引  

7.采用is not null 或者 is null条件时,可能不走索引

反例:select * from t_user where role is not null 网上很多文章说用到is null 就不走索引,本人验证后其实不完全正确 采用is null 条件时,可能走索引也可能不走索引(MySQL中决定使不使用某个索引执行查询的依据就是成本够不够小) 具体也可参考文章:https://blog.csdn.net/qq_43842093/article/details/124810536 解决方案:索引字段建议添加NOT NULL约束;官方建议索引字段设置为not null , 尽量把非索引的字段也定义为not null https://dev.mysql.com/doc/refman/8.0/en/data-size.html 0  

 

8.Join隐式转换导致索引失效

反例:如tor.user_no为varchar类,tu.user_no为int select tor.order_no from t_order tor left join t_user tu on tor.user_no = tu.user_no WHERE tor.user_no = 1 解决方案:规范建表,保持字段类型一致     其他参考: https://blog.csdn.net/qq_43842093/article/details/124810536 https://dev.mysql.com/doc/refman/8.0/en/data-size.html

标签:name,no,索引,user,MySQL,失效,where,select
From: https://www.cnblogs.com/Windge/p/17111290.html

相关文章

  • 在macos系统终端中使用mysql
    1.启动/usr/local/mysql/bin/mysql-uroot-p2.配置mysql环境变量使用如下命令:sudoln-s/usr/local/mysql/bin/mysql/usr/local/bin而后可通过以下命令运行my......
  • maven工程运行环境修改 maven的java工程取mysql数据库数据
    maven工程运行环境修改 <plugins><plugin><!--https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin-......
  • sqlalchemy_python_mysql
    /Users/song/Code/sqlalchemy_mysql_learn00/python_sqlalchemy_mysql/query_table_data.py#!/usr/bin/envpython3#-*-coding:utf-8-*-'''@File:query_table_d......
  • 5、MySQL中的锁
    1.6. MySQL中的锁InnoDB中锁非常多,总的来说,可以如下分类:这些锁都是做什么的?具体含义是什么?我们现在来一一学习。1.6.1.解决并发事务问题我们已经知道事务并发执行时可......
  • MySQL - 进阶
    1、存储引擎MySQL体系结构:连接层最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所......
  • 4.docker安装mysql
    下载mysql镜像打开docker镜像仓库https://hub.docker.com   我们下载官方镜像,点击打开   可以看到tags有很多不通版本的mysql   比如我想安装5.7......
  • MySQL主从复制
    原理配置第一步:准备主库以及从库,然后开放指定端口或者直接关闭防火墙 第二步:主库配置binlog-ignore-db=数据库名字:代表忽略对某数据库的复制binlog-do-db=数据......
  • Centos7用rpm安装MySQL数据库
    在Centos7下使用rpm安装下mysql的流程: 首先进入mysql官网的下载地址:​​ https://dev.mysql.com/downloads/mysq​​l/,然后在下载里面把os选择为RedHatEnterpriseLin......
  • MySQL锁
    全局锁 在进行备份的时候,需要加锁,此时只允许DQL语句,关于备份语句mysqldump-hip地址-uroot-p密码db01(需要备份的数据库)>D:/db01.sql;此语句不是mysql语句,使用直......
  • mysql 数据库的一些参数,常用模版和调优方式
    innodb_buffer_pool_size:这个参数是Mysql数据库最重要的参数之一,表示InnoDB类型的表和索引的最大缓存。它不仅仅缓存索引数据,还会缓存表的数据。这个值越大,查询......