linux12 -MYSQL数据库 -->10索引

一、索引

ps:数据都是存在上硬盘上的,查询数据不可避免的需要进行IO操作
1.什么是索引
1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容。
2)让获取的数据更有目的性,从而提高数据库检索数据的性能。

# 索引是存储引擎中一种数据结构,或者说数据的组织方式,又称之为键key
  是存储引擎用于快速找到 记录的一种数据结构。
# 表中的一行行数据按照索引的结构组织成了一种数据结构,该树叫B+树
	为数据库表中的一行行数据创建索引就好比是
	为书的一页页内容创建目录
2、为何用索引
1、提升查询速度
2、降低了写效率
#  应用程序对数据的读写比例基本为10:1
3、如何正确看待索引
1、项目上线前就提前考虑
2、索引不是越多越好,对于不必要的字段加索引,反而加大io负担
	
# 1、当表中有大量数据存在的前提下,创建索引速度会很慢
# 2、在创建索引完毕之后,对表读的性能会大幅度提升,但是会写的性能会很慢

    # 注:
1、索引不要随意创建
2、如果上线之后载想着加索引,光定位到索引身上就需要耗费很多时间,排查成本很高
3、如果某一张表的ibd文件中创建了很多棵索引树,意味着很小的一个update语句,就会导致很多棵索引树需要发生变化,从而把硬盘IO打上去

# 一个磁盘块存储的限制的
为什么用id字段为索引
占用空间少,一个磁盘块能够存储的数据多
那么降低了树的高度,从而减少查询次数
4、储备知识
# 1、索引的根本原理就是把硬盘IO次数降下来
  为一张表中的一行行记录创建索引就好比是为书的一页页内容创建目录
  有了目录结构后,我们以后的查询都应该通过目录去查询 
# 2、一次磁盘IO带来的影响
7200转/分钟 ---------》 120转/s
一次的io的延迟时间  == 平均寻道时间(5ms)+平均延迟时间(4ms)  约等于9ms
# 3、磁盘预读
一页就是一个磁盘块
innodb存储引擎一页16k,既一次读取16k
5、索引的优缺点
# 优点
1、极大地加速了索引过程,减少IO次数
2、创建唯一索引,保证了数据库表中的唯一性
3、加速了表与表之间的连接
4、针对分组和排序检索时,能够显著减少查询查询中的分组和排序

# 缺点
1、索引表占据物理空间
2、数据表中的数据增加、修改、删除的同时需要去动态维护索引表,降低了数据的维护速度

二、索引的数据结构

任何一种数据结构都不是凭空产生的,一定会有它的背景和使用场景,我们现在总结一下,我们需要这种数据结构能够做些什么,其实很简单,那就是:每次查找数据时把磁盘IO次数控制在一个很小的数量级,最好是常数数量级。那么我们就想到如果一个高度可控的多路搜索树是否能满足需求呢?就这样,b+树应运而生。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mh1hkYOe-1626167281861)(C:\Users\17155\Desktop\mysql img\1625390482403.png)]

如上图,是一颗b树,关于b树的定义可以参见B树,这里只说一些重点,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),如磁盘块1包含数据项17和35,包含指针P1、P2、P3,P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。真实的数据存在于叶子节点即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。
1、b树的查找过程
如图所示,如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的IO)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO。真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次IO,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IO,显然成本非常非常高。

img\67f52690982bf9e85b09c6763733a415.gif)]

2、b树性质
#  1)索引字段要尽量的小:
通过上面的分析,我们知道IO次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。

# 2)索引的最左匹配特性(即从左往右匹配):
当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性
3、Btree介绍
#  索引是如何加速查询的,它的原理是啥?
索引模型/结构从二叉树-》平衡二叉树-》b树最后到b+树,每种树到底有什么问题最终演变成到了b+树
=================================================================================
# 0、创建索引的两个步骤
  create index xxx on user(id);
  1、提取索引字段的值当作key,value就是对应的本行记录
  10 -------------> 10 zs
  7 --------------> 7 ls
  2、以key的为基础比较大小,生成树型结构
  leaf node:叶子节点
  non-leaf node:根节点、树枝节点
# 1、索引到底是一种什么样的数据结构:B+树
  二叉树、平衡二叉树、B树=》B+树
  
#二叉树:
  左节点的key值小于当前节点的key,而右节点的key大于当前节点,但是不能提速  -- #三次查找
  create index idx_id on use(id);
  select * from user where id =100;
  
 # 平衡二叉树:
    左子树与右子树的高度差不超过1
 # 一次iO就读一次节点,就相当于一辆卡车,只拉一个快递(一个节点只读一个一页到内存)
    每个节点只放了一条数据,相当于innodb存储引擎共16k的数据只放了一条数据,几个字节,浪费了许多

 # B树:
      一次io读入内存是一页数据,或者叫一个磁盘块的数据,磁盘块里包含了n个节点
      ps:根节点页常驻内存 -- #两次查找
 问题:页中的节点既存放key又存放对应记录值(values --》对应的是一行的完整记录)
		
# B+树:
    1、非叶子节点只放key(根、树枝节点放key),只有叶子节点才放key:value  --》非叶子节点能存放的key个数变多,衍生出指针越多,树会变得更矮更胖
    2、叶子节点也指针指向,是有序排列的,这意味着B+树在排序操作上有天然的优势(范围查询速度快)# (因为提前排好了,再次查找的时候不需要从头再找)--》叶子节点是双向连接的  
    select * from user where id > 18;
     先找到id=19所在的叶子节点,然后只需要根据叶子节点的链表指向向右查找下一个节点(id =19、id=20...)即不需要在回根节点查找
    3、叶子节点内的key值是单向链表,叶子节点和叶子节点之间是双向链表。即全都排好序了  --》排序会很快   
    4、一个页、一个磁盘块、一个节点固定大小16k,可以存放的数据量就很多
      安装每个节点存放1000数据来算,三层的B+树可以组织多少条数据1000  *1000 * 1000
    
    # 特点:
       1、B树只擅长等值查询
       2、B+树擅长等值查询、范围查询
				
create index idx_id on user(id);
select * from user where id = 28;
select * from user where id > 18 and id < 28;
# id=19

# 总结:
只要叶子节点才是存放的数据是真实的,其他数据都是虚拟数据的
树的层级越高,所经历的步骤就越多(树越高,查询的层级就越多)
树越低越好,查询速度越快

# 如果存1000个数据,那么三层B+树可以存放上10亿条数据 --------》 树的高度是几,那个n就是几 n的三次方

三、Mysql索引分类以及使用场景

1、功能
# 1. 索引的功能就是加速查找
# 2. mysql中的primary key,unique,联合唯一也都是索引,这些索引除了加速查找以外,还有约束的功能
2、MySQL的索引分类以及使用场景
不同的存储引擎支持的索引类型也不一样
# 1、InnoDB 
支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
# 2、MyISAM
不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
# 3、Memory
不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
# 4、NDB 
支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
# 5、Archive
不支持事务,支持表级别锁定,不支持 B-tree、Hash、Full-text 等索引;
1、分类
# 1.普通索引index :加速查找
create table t2(
		id int ,
		class_name varchar(10) unique,
		name varchar(16),
		age int
	);
	
    create index xxx on t1(name); # 增加索引
    drop index xxx on t1;  #删除索引
# 2.主键索引:primary key :加速查找+约束(不为空且唯一)
    
	create table t1(
		id int primary key auto_increment,
		class_name varchar(10),
		name varchar(16),
		age int
	);

	alter table student add primary key t1(id); # 增加索引
	alter table student drop primary key;  #删除索引
# 3、唯一索引:unique:加速查找+约束 (唯一)
	alter table country add unique key t1(class_name); # 增加索引
	alter table t1 drop index t1;  #删除索引
	
# 4、全文索引fulltext :用于搜索很长一篇文章的时候,效果最好。

# 5、空间索引spatial :了解就好,几乎不用
2、两种索引hash与btree
我们可以在创建上述索引的时候,为其指定索引类型
# hash类型的索引:
查询单条快,范围查询慢 (适合等值查询,不适合范围查询)
#  btree类型的索引:
b+树,层数越多,数据量指数级增长(通常都使用btree,因为innodb默认支持它)
3、聚集索引和非聚集索引
# 1、innodb存储引擎索引分类:
   1、hash索引:更适合等值查询,不适合范围查询 # innodb存储引擎不支持hash索引
   2、B+树索引:等值查询与范围查询都快
   3、全文索引:只可以用在MyISAM引擎  
 # 2、(主键索引)、聚集索引、聚簇索引:
   以主键字段的值作为key创建的索引(B+树)
   一张表中有且只有一个,通常应该是id字段,该B+树的叶子节点放的是主键值和本行完整的记录
   即: 表中的数据都聚集在叶子节点,所以称为聚集索引
   select * from user where id=2;
 # 3、(非聚集索引)、(非聚簇索引)、(二级索引)辅助索引:
   非聚集索引,非聚簇索引,辅助索引、二级索引:以非主键字段值为key构建的B+树,该B+树的叶子节点存放的是key与其对应的主键字段值
   create index yyy on user(name);
   select * from user where name="xxx";
   
ps:一张innodb存储引擎表中必须要有且只能由一个聚集索引,但是可以多个辅助索引
    针对非主键字段创建的索引(一张表中可以有多个)
# 4、聚集索引与辅助索引的异同
  相同点:
    都是B+树结构,意味着非叶子节点只放key
    而叶子节点放key:value

  不同之处
    聚集索引叶子节点key对应的那个value值是一整行完整的记录
    辅助索引叶子节点key对应的那个value值是其所对应的主键字段值

# 优化:
 尽量避免回表操作,主键索引最后在前面,辅助索引在右面	
 		
# 5、覆盖索引和回表操作									
覆盖索引:在当前你命中的索引结构中就能能到你想要的所有数据,称之为覆盖了索引
    主键索引-》id字段
    辅助索引-》name字段
select * from t3 where id = 3;             -- 覆盖了索引
select name,id from t3 where name="egon";  -- 覆盖了索引
		
回表操作/查询:在当前你命中的索引结构中不能拿到你想要的所有数据,那么需要根据其对应的主建字段去聚集索引里重新查一遍,直到拿到完整记录,称之为回表操作
    主键索引-》id字段
    辅助索引-》name字段
select name,id,age from t3 where name="egon";
# 6、联合索引->最左前缀匹配原则
    -primary key(id,name):联合主键索引
    -unique(id,name):联合唯一索引
    -index(id,name):联合普通索引
    
    create index idx_xxx on s1(name,age,gender);
    查询条件中出现:name、age
    查询条件中出现:name、gender
    查询条件中出现:name、age、gender

    where  age = 18 and name = "egon"  and gender="male"
    10,11,12
    10,13,0
==================================================================================
# 7、数据库索引
1、对区分度高并且占用空间小的字段建立索引
2、针对范围查询命中了索引,如果范围很大,查询效率依然很低,如何解决
	要么把范围缩小
	要么就分段/分页取值,一段一段取最终把大范围给取完
	缓存
	
3、索引下推技术(默认开启)# 就是好多种方案选择最优的那种查找出来的
4、不要把查询字段放到函数或者参与运算
	select count(*) from where id*12 = 3;
	select count(*) from where id = 3/12;
5、索引覆盖
	在命中索引的前提下,select查找值存在于本索引树中
	create index idx_name on s1(name);
	select name,id from s1 where name="egon";  -- 覆盖了索引
	select name,id,age from s1 where name="egon";  -- 没有覆盖索引,需要回表操作
	
	注意:如果查询条件是用的主键字段,那么无法select查什么都会覆盖索引,都不需要回表
		  所以说,在查询语句中,能用主键字段作为查询依据就尽量用它
4、数据库常识
# 1、数据库5.5之前的数据不可以独立
# 2、5.6版本不支持自动收缩,但是支持独立
# 3、5.7版主支持自动收缩,支持独立
===================================================================================
单表300w条记录-》硬盘空间200m

uv:user view单日累计用户访问---》反映的是网站的规模
2-5w
pv:page view单日累计页面被点击的次数---》反映的是产品的好坏
20w-50w

最大并发(同时在线人数最大多少):一天内,某一时刻的并发量
1000人同时在线

数据库(读多写少):
累计2w的UV,平均每人往数据库中写入一条数据,
那么单日新增数据条数为2w条
2w条数据库-》占用空间大概2M

结论:以2-5w uv为例,单日数据库空间增长量从几M到几十M不等
5、场景
举个例子来说,比如你在为某商场做一个会员卡的系统。 
这个系统有一个会员表
有下列字段:
    会员编号 INT
    会员姓名 VARCHAR(10)
    会员身份证号码 VARCHAR(18)
    会员电话 VARCHAR(11)
    会员住址 VARCHAR(50)
    会员备注信息 TEXT

那么这个 会员编号,作为主键,使用 PRIMARY
会员姓名 如果要建索引的话,那么就是普通的 INDEX
会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)

#除此之外还有全文索引,即FULLTEXT
会员备注信息 , 如果需要建索引的话,可以选择全文搜索。
用于搜索很长一篇文章的时候,效果最好。
用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
但其实对于全文搜索,我们并不会使用MySQL自带的该索引,而是会选择第三方软件如Sphinx,专门来做全文搜索。
 
#其他的如空间索引SPATIAL,了解即可,几乎不用

四、创建/删除索引语法

方法一:创建表时:
       create table 表名 (
                 字段名1  数据类型 [完整性约束条件…],
                 字段名2  数据类型 [完整性约束条件…],
                 [ unique | fulltext | spatial ] index | key
                 [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                 );
                 
方法二:CREATE在已存在的表上创建索引
         CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                 ON 表名 (字段名[(长度)]  [ASC |DESC]) ;
 
 

方法三:ALTER TABLE在已存在的表上创建索引
        ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                 索引名 (字段名[(长度)]  [ASC |DESC]) ;

···善用帮助文档···
help create
help create index
·················
1、案例
# 1、为user表的id字段创建索引,会以每条记录的id字段值为基础生成索引结构 
create index 索引名 on user(id); 
使用索引 
select * from user where id = xxx; 
# 2、为user表的name字段创建索引,会以每条记录的name字段值为基础生成索引结构
create index 索引名 on user(id); 
使用索引 
select * from user where name = xxx;
==================================================================================
1.创建索引
-在创建表时就创建(需要注意的几点)
    create table s1(
    id int ,#可以在这加primary key
    #id int index #不可以这样加索引,因为index只是索引,没有约束一说,
    #不能像主键,还有唯一约束一样,在定义字段的时候加索引
    name char(20),
    age int,
    email varchar(30),
    #primary key(id) #也可以在这加
    index(id) #可以这样加
    );
    
 -在创建表后在创建
    create index name on s1(name); # 添加普通索引
    create unique age on s1(age);  # 添加唯一索引
    alter table s1 add primary key(id); # 添加住建索引,也就是给id字段增加一个主键约束
    create index name on s1(id,name); # 添加普通联合索引

2.删除索引
    drop index id on s1;
    drop index name on s1; #删除普通索引
    alter table t2 drop index t2;#删除唯一索引,就和普通索引一样,不用在index前加unique来删,直接就可以删了
    alter table s1 drop primary key; #删除主键(因为它添加的时候是按照alter来增加的,那么我们也用alter来删)
    
3.查看索引
	show index from s1;

五、索引测试

1、准备测试数据
#1. 准备表
create table t1(
id int,
name varchar(20),
gender char(6),
email varchar(50)
);

#2. 创建存储过程,实现批量插入记录
delimiter $$ #声明存储过程的结束符号为$$
create procedure auto_insert1()
BEGIN
    declare i int default 1;
    while(i<3000000)do #300w数据
    insert into t1 values(i,'mm','male',concat('mm',i,'@boy'));
    set i=i+1;
    end while;
END$$  #$$结束
delimiter ; #重新声明分号为结束符号

#3. 查看存储过程
show create procedure auto_insert1\G 

#4. 调用存储过程
call auto_insert1(); # 过程会很慢,一分钟后可强制结束,也已将创建了一些
2、未创建索引前的查询速度缓慢
#无索引:从头到尾扫描一遍,所以查询速度很慢
mysql> select * from s1 where id=333;
+------+---------+--------+----------------+
| id   | name    | gender | email          |
+------+---------+--------+----------------+
|  333 | mm| male     | cm333@oldboy   |
+------+---------+--------+----------------+
1 row in set (1.33 sec)

mysql> explain select * from s1 where id=333;


mysql> select * from s1 where email='cm333@oldboy';
+------+---------+--------+----------------+
| id   | name    | gender | email          |
+------+---------+--------+----------------+
|  333 | cm333   | male   | cm333@oldboy   |
+------+---------+--------+----------------+
1 row in set (1.50 sec)
3、加上索引后查询速度极快
1. 一定是为搜索条件的字段创建索引,比如select * from s1 where id > 5;就需要为id加上索引

2. 在表中已经有大量数据的情况下,建索引会很慢,且占用硬盘空间,插入删除更新都很慢,只有查询快
比如create index idx on s1(id);会扫描表中所有的数据,然后以id为数据项,创建索引结构,存放于硬盘的表中。
建完以后,再查询就会很快了

mysql> create index idx on s1(id);

3. 需要注意的是:innodb表的索引会存放于s1.ibd文件中,而myisam表的索引则会有单独的索引文件table1.MYI

mysql> select * from s1 where id=333;
+------+---------+--------+----------------+
| id   | name    | gender | email          |
+------+---------+--------+----------------+
|  333 | cm333   | male   | cm333@oldboy   |
+------+---------+--------+----------------+
1 row in set (0.01 sec)

#  建立完索引,那个数据的ibd文件是变大了,但是如果删除完索引,但是那个ibd文件却不会变小,这是一个bug
#  因为ibd里面的数据和索引里面的内容都放在ibd文件里了

六、 正确使用索引

1、索引命中也未必会加速
并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题


# 1、如何正确使用索引
1、以什么字段的值为基础构建索引
2、最好是不为空、唯一、占用空间小的字段

# 2、针对全表查询语句如何优化?
应用场景:用户想要浏览所有的商品信息
select count(id) from s1;

如何优化:
开发层面分页查找,用户每次看现从数据中拿

# 3、针对等值查询
以重复度低字段为基础创建索引加速效果明显
create index xxx on s1(id);
select count(id) from s1 where id = 33;

以重复度高字段为基础创建索引加速效果明显
create index yyy on s1(name);
select count(id) from s1 where name="egon"; -- 速度极慢
select count(id) from s1 where name!="egon";  -- 速度快
select count(id) from s1 where name="mm";  -- 速度快

以占用空间大字段为基础创建索引加速效果不明显

# 总结:给重复低、且占用空间小的字段值为基础构建索引


# 4、关于范围查询
select count(id) from s1 where id=33;
select count(id) from s1 where id>33;
select count(id) from s1 where id>33 and id < 36;
select count(id) from s1 where id>33 and id < 1000000;


# 总结:innodb存储能加速范围查询,但是查询范围不能特别大

5、关于条件字段参与运算
select count(id) from s1 where id*12 = 10000;
select count(id) from s1 where id = 10000/12;
select count(id) from s1 where func(id) = 10000/12;

# 总结:不要让条件字段参与运算,或者说传递给函数
2、不等于!=

img

3、 between …and…

img

4、like

img

- 1、在创建索引的时候,会把该列所有的数据按照btree的方式进行排序

- 2、为常作为查询条件的字段建立索引

- 3、限制索引的数目,不要每列都创建索引
每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。

- 4、在同一列上,尽量避免创建多个索引,可以创建多个但是它们是有优先级的,先走一个就不会再走另一个索引了;
    alter table student add index idx_name(name);
    alter table country add unique key uni_name(name);

- 5、避免对大列建索引,在数据很长的列上创建前缀索引

- 6、如果可以创建唯一索引,就创建唯一索引(该列的数据不重复),查询速度快

- 7、不要对重复度高的字段创建索引

- 8、索引不要参与计算

- 9、为经常要排序,分组,联合操作的列,创建联合索引
经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。
如果为其建立索引,可以有效地避免排序操作

- 10、尽量使用前缀来索引
创建索引的时候,可以给该列所有数据进行排序
create index xxxx on tb(title(19)) # text类型,必须制定长度

- 11、删除不再使用或者很少使用的索引
表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

- 12、避免使用select *

- 13、count(1)或count(列) 代替 count(*),ps:mysql中没有差别了

- 14、创建表时尽量时 varchar 代替 char

- 15、表的字段顺序固定长度的字段优先

- 16、使用连接(JOIN)来代替子查询(Sub-Queries)

- 17、连表时注意条件类型需一致

七、 慢查询优化的基本步骤

# 0.先运行看看是否真的很慢,注意设置SQL_NO_CACHE
# 1.where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高
# 2.explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)
# 3.order by limit 形式的sql语句让排序的表优先查
# 4.了解业务方使用场景
# 5.加索引时参照建索引的几大原则
# 6.观察结果,不符合预期继续从0分析
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FikL-09-19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值