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

相关推荐
四四夕夕1 小时前
【保姆级图文】1panel 面板部署雷池社区版:从环境搭建到安全验证全流程实录
数据库·安全
仍然探索未知中2 小时前
MySQL数据库介绍以及安装(本地windows、Ubuntu 20.04)
数据库·mysql
m0_653031362 小时前
腾讯云TCCA认证考试报名 - TDSQL数据库交付运维工程师(PostgreSQL版)
运维·数据库·腾讯云
朱小勇本勇3 小时前
Clang Code Model: Error: The clangbackend executable “D:\Soft\Qt5.12.12\Tool
运维·服务器·数据库·qt·nginx
代码的余温3 小时前
B树与B+树:数据库索引背后的秘密
数据结构·数据库·b树
noravinsc3 小时前
django filter 筛选 取出全部用户id
数据库·mysql
不恋水的雨3 小时前
解决sql查询中in查询项过多时很慢的问题
数据库·sql·mysql
betazhou3 小时前
Oracle goldengate参数:TRANLOGOPTIONS DBLOGREADER
数据库·oracle·dblogreader
云心雨禅4 小时前
Spring Boot热更新技巧:节省90%重启时间
java·数据库·spring boot
码上库利南4 小时前
详细讲解Redis为什么被设计成单线程
数据库·redis·缓存