MySQL索引调优(一)索引的基本知识

索引的基本知识

在平时的对外项目交付中,经常要做些POC,快速开发相关web应用,每次设计库表结构都会考虑索引的使用,索引用的好,对于查询体验是质的提升,下面总结了关于索引优化的一些点,结合一些简单案例(之前学习的一些存档),做一个分享

索引的优点

  1. 大大减少服务器需要扫描的数据量
  2. 帮助服务器避免排序和临时表
  3. 将随机io变成顺序io

索引的用处

  1. 快速查找匹配where子句的行
  2. 从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引
  3. 如果表具有多列索引,则优化器可以使用索引的任何最左缀来查找行
  4. 当有表链接的时候,从其它表检索行数据
  5. 查找特定索引列的min或max值
  6. 如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组
  7. 在某些情况下,可以优化查询以检索值而无需查询数据行

索引的分类

  • 主键索引: 简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没有主键,但最多只能有一个主键,并且主键值不能包含NULL
  • 唯一索引:确保表中没有两个数据行具有完全相同的键值来帮助维护数据完整性
  • 普通索引:最基本的索引,没有任何限制,是我们经常使用到的索引。
  • 全文索引:全文索引(FULLTEXT)仅可以适用于MyISAM引擎的数据表,不过mysql5.7以后innodb也支持了,作用于CHAR,VARCHAR、TEXT数据类型的列。
  • 组合索引:将几个列作为一条索引进行检索,使用最左匹配原则。

索引采用的数据结构

  • 哈希表
  • B+树
    这部分后续会单独列文章分享。

索引匹配方式

执行下面建表语句:

create table staffs(
    id int primary key auto_increment,
    name varchar(24) not null default '' comment '姓名',
    age int not null default 0 comment '年龄',
    pos varchar(20) not null default '' comment '职位',
    add_time timestamp not null default current_timestamp comment '入职时间'
  ) charset utf8 comment '员工记录表';
-----------
alter table staffs add index idx_nap(name, age, pos);
  • 全值匹配:全值匹配指的是和索引中的所有列进行匹配,例如
    explain select * from staffs where name = 'July' and age = '23' and pos = 'dev';
  • 匹配最左前缀:只匹配前面的几列,例如:explain select * from staffs where name = 'July' and age = '23'; explain select * from staffs where name = 'July';
  • 匹配列前缀:可以匹配某一列的值的开头部分,例如;explain select * from staffs where name like 'J%';explain select * from staffs where name like '%y';
  • 匹配范围值:可以查找某一个范围的数据,explain select * from staffs where name > 'Mary';
  • 精确匹配某一列并范围匹配另外一列:可以查询第一列的全部和第二列的部分,例如explain select * from staffs where name = 'July' and age > 25;
  • 只访问索引的查询:查询的时候只需要访问索引,不需要访问数据行,本质上就是覆盖索引,例如:explain select name,age,pos from staffs where name = 'July' and age = 25 and pos = 'dev';

猜你喜欢

转载自blog.csdn.net/sun6838693/article/details/115307491