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进行查看

sql 复制代码
-- 查看当前是否支持 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评估使用单列索引效率更高而使用了单列索引,但是存在单列索引中找不到的返回列,那么此时会进行回表查询,降低了效率。

相关推荐
Quincy_Freak几秒前
银河麒麟 SQLite 实操:Excel 导入与 SQL 语法编辑功能详解摘要
数据库·arm·数据库管理·大数据分析·银河麒麟·aarch64·sqlitego
万亿少女的梦1688 分钟前
基于Node.js和Express的旅游信息管理平台设计与开发
mysql·node.js·express·系统设计·旅游信息管理
Dovis(誓平步青云)14 分钟前
《C/C+++ Boost 轻量级搜索引擎实战:架构流程、技术栈与工程落地指南——HTML文件的清洗(上篇)》
开发语言·数据库·c++·搜索引擎·开源
蚁库2 小时前
Oracle 12c + ASM + UDEV 实战教程:从磁盘规划到日常管理,10节视频完整通关
数据库·oracle
云和恩墨11 小时前
数据库一体机简史:从ODA到zData X,命名之中的玄机
数据库·vr
万亿少女的梦16811 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
万亿少女的梦16811 小时前
基于SpringBoot与Vue的历史博物馆展品展示与游客管理系统设计
spring boot·mysql·vue·系统设计·博物馆管理系统
数据库小学妹12 小时前
KES是什么?国产数据库技术架构、核心能力与选型实战解析
数据库·经验分享·架构·国产数据库·数据库选型·信创数据库
Database_Cool_13 小时前
向量检索加速首选:阿里云 Tair 内置向量能力毫秒级召回
数据库·阿里云
强健的石头13 小时前
django文件对象是什么?
数据库·django·sqlite