当前位置: 首页 > news >正文

[MySQL]SQL优化之索引的使用规则

🌈键盘敲烂,年薪30万🌈

目录

一、索引失效

📕最左前缀法则

📕范围查询>

📕索引列运算,索引失效

📕前模糊匹配

📕or连接的条件

📕字符串类型不加 '' 

📕数据分布

📕is not null

二、SQL提示:

①建议索引

②强制索引

③忽略索引

三、覆盖索引

四、前缀索引 


一、索引失效

📕最左前缀法则

规则:

  1. 最左侧的列必须存在,如果不存在,索引失效,和位置无关!!!
  2. 从索引的最左侧开始,不能跳跃某一索引列,如果跳过某一列,那么后面的索引都会失效。

例如:

  • 有联合索引 id_name_age_gender (name字段为最左列)

遵循法则:select * from user where name = 'zhang' and age = 12 and gender = 1;

遵循法则:select * from user where age = 10 and name = 'zhang';

不遵循法则:select * from user where age = 10 and gender = 1;

📕范围查询>

范围查询右侧的列索引失效

例如: > < 号会使索引失效

select * from user where age > 10;

 故:

尽量使用 >= 或者 <=

📕索引列运算,索引失效

对索引列进行运算,索引失效,因为运算完之后新的数据不具有索引结构

select * from user where substring(name, 0 ,2) = 'zh';

 

📕前模糊匹配

%在最左侧索引失效

索引失效:select * from user where name like '%hang';

索引不失效:select * from user where name like 'zhan%';

📕or连接的条件

使用or连接的字段索引都会失效

select * from user where id = 1 or name = 'zhang';
📕字符串类型不加 '' 

如果数据库字段类型为varchar 但是查询每加'',索引失效

select * from user where name = zhang;
📕数据分布

如果MySQL经过判断之后发现全表扫描比按索引查询快,就会走全表扫描

📕is not null

如果一列数据基本没有null,is not null就会使索引失效

二、SQL提示:

例如:有两个索引 id_name_age   id_name

执行:select * from user where name = 'zhang';

会走哪个索引呢❓

  • 这时mysql经过优化后会选择一个索引,但是性能不一定最佳,因此可以指定索引。
①建议索引
select * from user use index(id_name) where name = 'zhang';

注意:提出的建议,mysql不一定听。 

②强制索引
select * from user force index(id_name) where name = 'zhang';
③忽略索引
selct * from user ignore index(id_name_age) where name = 'zhang';

三、覆盖索引

查询使用了索引,并且查询的字段 (select 后面的字段) 在该索引中可以全部找到。

例如:

  • 回表查询

故:

尽量避免使用select * ,这很容易导致回表查询。

四、前缀索引 

可以将字符串的一部分抽取出来作为前缀创建索引

例如:选取前4个字符作为name字段的索引

create index id_name on user(name(4));

相关文章:

  • x86-64的寄存器使用规则
  • 管理类联考——数学——真题篇——按知识分类——代数
  • 【产品经理】需求池和版本树
  • Mybatis是如何进行分页的?
  • 入职字节外包一个月,我离职了。。。
  • Leetcode 2957. Remove Adjacent Almost-Equal Characters
  • 开源CDN软件GoEdge —— 筑梦之路
  • 常用的C语言宏定义
  • 阿里云国际版无法远程连接Windows服务器的排查方法
  • ACMMM 2024 ACM International Conference on Multimedia
  • 前端知识(十三)——JavaScript监听按键,禁止F12,禁止右键,禁止保存网页【Ctrl+s】等操作
  • 【Qt5】QVersionNumber
  • Mysql分布式集群部署---MySQL集群Cluster将数据分成多个片段,每个片段存储在不同的服务器上
  • 基于FPGA的视频接口之高速IO
  • Android渲染-AHardwareBuffer
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • canvas 高仿 Apple Watch 表盘
  • ES6系列(二)变量的解构赋值
  • ES6之路之模块详解
  • Java 网络编程(2):UDP 的使用
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • log4j2输出到kafka
  • React Native移动开发实战-3-实现页面间的数据传递
  • Shell编程
  • ubuntu 下nginx安装 并支持https协议
  • 安卓应用性能调试和优化经验分享
  • 好的网址,关于.net 4.0 ,vs 2010
  • 技术:超级实用的电脑小技巧
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 面试总结JavaScript篇
  • 我有几个粽子,和一个故事
  • 再谈express与koa的对比
  • 自制字幕遮挡器
  • kubernetes资源对象--ingress
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​iOS安全加固方法及实现
  • ​MySQL主从复制一致性检测
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (6)设计一个TimeMap
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (solr系列:一)使用tomcat部署solr服务
  • (SpringBoot)第二章:Spring创建和使用
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (黑客游戏)HackTheGame1.21 过关攻略
  • (未解决)macOS matplotlib 中文是方框
  • (转)visual stdio 书签功能介绍
  • .cfg\.dat\.mak(持续补充)
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET CORE 第一节 创建基本的 asp.net core
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .Net接口调试与案例
  • .NET连接MongoDB数据库实例教程
  • .NET设计模式(11):组合模式(Composite Pattern)