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

MySQL 索引和select优化

1.索引

1.1 索引的概念

        索引(index)是帮助MySQL高效获取数据的有序数据结构,这些数据结构以某种方式指向数据,这样就可以在这种数据结构之上实现高级查找,而不是全表扫描。

        MySQL中选择的数据结构是 B+ 树。

        innoDB的逻辑存储结构

表空间 -- 段 -- 区 -- 页 --- 行,innoDB的最小操作单元是页。一个区固定大小1M,页固定大小16K,所以一个区有64个页

1.2 索引的分类

在innoDB中,根据索引的存储形式,又可以分为聚焦索引和二级索引:

如果我们查询设置的条件是二级索引,那么它会先通过二级索引查找到主键值,然后再到聚焦索引中查询对应的数据,这个过程被称作回表查询

1.3 索引语法

1.3.1 创建索引

        create [unique/fulltext] index 索引名 on 表名(字段名列表)

        eg. create unique index student_name on student(name)

如果只有一个字段,那么这个索引被称作单列索引,多个字段则是联合索引

1.3.2 查看索引

        show index from 表名

        eg. show index from student

1.3.3 删除索引

        drop index 索引名 on 表名

        eg. drop index student_name on student

2.SQL性能查看

2.1 SQL性能分析

2.1.1 查看当前数据库SQL执行频率

        show global/session status like 'com_______'(七个下划线,一个下划线代表一个字符,insert,update,delete,select都是六个字符加上一个下划线)

如果当前数据库是查询的频率最高,那么我们就可以考虑优化查询SQL。

2.1.2 慢查询日志

慢查询日志只能记录超过设置时间的查询语句,如果我们的超时设置为2,但是有些查询花费了1.9s,那么它是不能被慢日志记录的,此时我们需要使用profiling进行查看

-- 查看当前是否支持 profiling
select @@have_profiling ;-- 查看profiling是否打开  0-关闭  1-打开
select @@profiling ;-- 打开profiling 如果是0就是关闭
set profiling = 1 ;-- 一系列查询操作
select * from student ;
select * from student where id = 1 ;
select name from student where id = 1 ;-- 查看开启profiling期间所有查询花费的时间
show profiles ;

2.1.3 explain/desc 查看查询计划

3.索引失效的情况

3.1 最左前缀法则

通俗来讲,如果存在一个联合索引 (字段1,字段2,字段3),我们在设置查询条件的时候必须出现字段1才会使用索引,否则是全文查找。

下面分情况讨论:

        使用  字段1----->会使用索引

        使用  字段1,字段2----->会使用索引,但是不会使用字段3的索引

        使用  字段2,字段3----->不会使用索引,不符合最左前缀法则,字段1未出现

        使用  字段1,字段3----->会使用索引,但是字段3索引会失效,因为跳过了字段2

字段出现的先后顺序没有要求,比如  字段3,字段2,字段1  也是会使用索引的。

3.2 范围查询

如何避免:使用>=或者between and 不会导致失效。

3.3 索引列运算

3.4 字符串不加引号

3.5 头部模糊匹配

 3.6 or 连接的条件

3.7 数据分布影响

4.索引使用

4.1 SQL提示

4.2 覆盖索引

为什么要返回的列在索引中能全部找到能提示效率呢?

如果要返回的列在联合索引中不能全部找到,那么它就会多一个回表查询的步骤,降低了查询的效率。因为select * 极其容易出现回表查询(只有在有一个联合索引包括表中所有列的时候才不会出现回表查询),所以不建议使用select *。

4.3 前缀索引

4.4 单列索引和联合索引

如果MySQL评估使用单列索引效率更高而使用了单列索引,但是存在单列索引中找不到的返回列,那么此时会进行回表查询,降低了效率。

http://www.lryc.cn/news/572002.html

相关文章:

  • ​​网络工程师知识点精讲与例题解析:数据链路层技术​​
  • 计算机视觉课程总结
  • 【Node.js 的底层实现机制】从事件驱动到异步 I/O
  • Python Peewee库连接和操作MySQL数据库
  • 条件向量运算与三元表达式
  • C语言——枚举
  • 解决Matplotlib三维图无法旋转的问题
  • AndroidR平台ToastPresenter引出BinderProxy泄漏
  • 实战指南:用DataHub管理Hive元数据
  • SkyWalking 部署与应用(Windows)
  • 7-4 身份证号处理
  • 企业班车出行服务系统的SDK选型、核心功能优化迭代的避坑复盘
  • Android软件适配遥控器需求-案例经验分享
  • WebRTC(六):ICE协议
  • 汇编语言期末快速过手笔记
  • React Native WebView键盘难题:如何让输入框不被键盘遮挡?
  • Alpha WORLD上线在即:首发AIOT,重塑项目价值格局
  • 48-Oracle CDB下的SID-实例名-服务名
  • Transformer-BiGRU、Transformer、CNN-BiGRU、BiGRU、CNN五模型多变量时序预测
  • 【计算机常识】--docker入门+docker desktop的使用(一)
  • MySQL 多表查询、事务
  • 如何使用ChatGPT快速完成一篇论文初稿?
  • Controller Area Network (CAN) 通信机制简介
  • Ubuntu服务器启动jupyter notebook,本地电脑Mobaxterm访问
  • 一个电脑装了多个python哪个生效?在 Windows 系统中修改环境变量 PATH 的优先级
  • Vue.js 按键修饰符详解:提升键盘事件处理效率
  • 筑牢安全防线:电子文件元数据驱动的 AI 知识库可控管理方案
  • TradingAgents:基于多智能体的大型语言模型(LLM)金融交易框架
  • 从零学起VIM
  • 解决sql查询中in查询项过多时很慢的问题