文章目录

  • 索引优化
  • 索引分类
  • 回表
  • 覆盖索引
  • 键表SQL
  • 来使用口诀来练习


索引优化

  • 索引优化不只是单单对复合索引
  • 也是对普通索引的一种优化
索引分类

分类角度

索引名称

数据结构

B+数,Hash索引, B数等

存储层面

聚簇索引,非聚簇索引

逻辑层面

主键索引,普通索引,复合索引(MySQL 组合索引和联合索引和复合索引都是一个东西),唯一索引,空间索引等

回表
  • 当我们执行一条查询语句select * from persion where id=6,因为直接使用的是主键id查询,所以就会用主键索引,由于主键索引直接关联了整个所有数据,所以,引擎只要执行一次就能查询出结果

如果执行的SQL语句是非主键索引

select * from person where age = 19
  • 以上的这条语句走age的普通索引,索引先根据age搜索等于18的索引记录,找到id=10,然后再到主键索引搜索一次,然后拿出查询的数据
  • 从普通索引查出主键索引,然后查询出数据的过程叫做回表,由于回表需要多执行一次查询,这也是为什么主键索引要比普通索引要快的原因,所以,我们要尽量使用主键查询
覆盖索引
  • 我们通常创建索引的依据都是根据查询的where条件,但是这只是我们通过的做法,我们根据上面的分析可以知道,如果要想查询效率高,第一,使用主键索引,第二,避免回表,也就是尽可能的在索引中就能获得想要的数据。如果一个索引包含了需要查询的字段,那么我们就叫做"覆盖索引"
键表SQL

创表

create table staffs(
    id int primary key auto_increment,
    name varchar(24) not null default "",
    age int not null default 0,
    pos varchar(20) not null default "",
    add_time timestamp not null default CURRENT_TIMESTAMP 
)charset utf8;

插入数据

insert into staffs(`name`,`age`,`pos`,`add_time`) values('z3',22,'manager',now());
insert into staffs(`name`,`age`,`pos`,`add_time`) values('July',23,'dev',now());
insert into staffs(`name`,`age`,`pos`,`add_time`) values('2000',23,'dev',now());

建立复合索引

create index idx_staffs_NameAgePos on staffs(name, age, pos)

mysql 性能 参数 调优 mysql5.7性能优化_mysql 性能 参数 调优


mysql 性能 参数 调优 mysql5.7性能优化_mysql_02

mysql 性能 参数 调优 mysql5.7性能优化_SQL_03


mysql 性能 参数 调优 mysql5.7性能优化_主键_04

mysql 性能 参数 调优 mysql5.7性能优化_数据库_05

口诀

  • 全值匹配我最爱,最左前缀要遵守
  • 带头大哥不能死,中间兄弟不能断
  • 索引列上少计算,范围之后全失效
  • like百分写最右,覆盖索引不写星
  • 不等空值还有or,索引失效要少用
  • varchar引号不可丢,SQL高级也不难
来使用口诀来练习

mysql 性能 参数 调优 mysql5.7性能优化_mysql 性能 参数 调优_06


mysql 性能 参数 调优 mysql5.7性能优化_主键_07

mysql 性能 参数 调优 mysql5.7性能优化_mysql 性能 参数 调优_08


mysql 性能 参数 调优 mysql5.7性能优化_SQL_09


mysql 性能 参数 调优 mysql5.7性能优化_主键_10

mysql 性能 参数 调优 mysql5.7性能优化_mysql_11


mysql 性能 参数 调优 mysql5.7性能优化_数据库_12

mysql 性能 参数 调优 mysql5.7性能优化_mysql_13