mysql之索引

内容概要

  • 如何操作索引

  • 如何判断当前SQL语句是否走了索引

  • 脏读、幻读、不可重复读等理论

内容详细

如何操作索引

# 添加索引

   1.主键索引
   alter table t1 add primary key pri_id(id); # 给t1表中的id字段添加primary key索引

   2.唯一索引
   alter table t1 add unique key uni_name(name);  # 给t1表中的name字段添加unique key索引
   # 注:unique key除了添加索引功能外,还有唯一的限制条件(如果名字字段有重复项,无法添加)

   3.普通索引
   alter table t1 add index ind_age(age); # 给t1表中的age字段添加index key索引
   
   4.前缀索引(属于普通索引)
  alter table t1 index ind_name(name(4)); # 给name字段的前4个字符添加索引
       
       # 避免对大列建索引,如果有就使用前缀索引,但前缀索引不是越长越好
当索引是很长的字符序列时,这个索引将会很占内存,而且会很慢,这时候就会用到前缀索引了。所谓的前缀索引就是将索引的前面几个字母作为索引,但是要降低索引的重复率,索引我们还必须要判断前缀索引的重复率
  eg:博客内容 百度搜索内容等使用的是前缀索引
       
   5.联合索引(属于普通索引)
  相亲平台 搜索心仪对象的时候
  # 最左匹配原则
  gender money height beautiful
alter table t1 add index idx_all(name,age,sex)
   
   """
  联合索引是指对表上的多个列进行索引,又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
  """
   
 

# 查看索引
show index from t1;

创建唯一索引需要提前排查是否有重复数据
"""
思路:1.对所选字段计数查看结果;
2.对所选字段计数并去重,比对两次结果.

  也可以对所选字段进行分组,计数
"""
select count(字段) from t1;
 select count(distinct(字段)) from t1;


# 删除索引
alter table t1 drop index 索引名(idx_name、idx_all...)

如何判断当前SQL语句是否走了索引(explain句式)

全表扫描
不走索引 一行行查找数据 效率极低 生产环境下尽量不要书写类似SQL
索引扫描
走索引 加快数据查询 建议书写该类型SQL

# explain就是帮助我们查看SQL语句属于那种扫描
用法:explain sql语句;
如果explain得到的结果是all那就是没有走索引

# 常见的索引扫描类型:
1.index
   2.range
   3.ref
   4.eq_ref
   5.const
   6.system
   7.null
   
 从上到下,性能从最差到最好,我们认为至少要达到range级别

# 不走索引的情况
1.没有查询条件,或者查询条件没有建立索引
   2.查询结果集是原表中的大部分数据(25%以上)
   3.索引本身失效,统计数据不真实
   4.查询条件使用函数在索引列上或者对索引列进行运算,运算包括(+-*等)
   5.隐式转换导致索引失效
  eg:字段是字符类型,查询时使用整型(底层会帮你把整型转换成字符类型)
    6.<>(不等于),not in 不走索引
  单独的>,<,in 有可能走,也有可能不走,和结果集有关,尽量结合业务添加limit、or或in尽量改成union
7.like "%_" 百分号在最前面不走 # 模糊查询
  select * from t1 where name like "%m" # 不走索引
       select * from t1 where name like "m%" # 走索引
       
    8.单独引用联合索引里非第一位置的索引列
   
"""
索引的创建会加快数据的查询速度 但是一定程度会拖慢数据的插入和删除速度,所有说索引不是越多越好
"""

隔离级别

在SQL标准中定义了四种隔离级别,每一种级别都规定了一个事务中所做的修改
# InnoDB支持所有隔离级别
set transaction isolation level 级别

1.read uncommitted(未提交读)
事务中的修改即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,这一现象也称之为"脏读"
2.read committed(提交读)
大多数数据库系统默认的隔离级别
 一个事务从开始直到提交之前所作的任何修改对其他事务都是不可见的,这种级别也叫做"不可重复读"
3.repeatable read(可重复读) # MySQL默认隔离级别
能够解决"脏读"问题,但是无法解决"幻读"
 所谓幻读指的是当某个事务在读取某个范围内的记录时另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录会产生幻行,InnoDB和XtraDB通过多版本并发控制(MVCC)及间隙锁策略解决该问题
4.serializable(可串行读)
强制事务串行执行,很少使用该级别
   
https://www.cnblogs.com/Dominic-Ji/p/15560680.html

 

posted @ 2021-11-20 15:10  一叶松  阅读(78)  评论(0编辑  收藏  举报