1.mysql索引类型
1.普通索引允许空值
2.唯一索引允许空值
3.主键索引不允许空值
4.组合索引(指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合)
5.全文索引
2.mysql索引失效情况
首先怎么查看某条语句是否走了索引呢
explain select * from emp where name = ‘Jefabc’
用 explin或者desc关键字
type表示表的连接类型,由上至下,效率越来越高
ALL : 全表扫描
index : 索引全扫描
range : 索引范围扫描,常用语<,<=,>=,between,in等操作
ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref : 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system : 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null : MySQL不访问任何表或索引,直接返回结果
!!你暂时要记住 all就是不走索引,index就是索引全扫描,range索引范围扫描,ref联合查询返回唯一数据,eq_ref使用唯一索引扫描所以更快。
失效情况:
1.联合索引没有遵循最左原则
2.使用select *
3.索引列上有计算、用了函数
4.like 左侧加了%
5.字段类型不同 比如把varchar和int混了
6.列对比explain select * from user where id=height
7.not in、not exist等关键字导致
exist语句没怎么用过,这个关键字是对内层查询的查询,只返回真或者假
(
select * from employee
where exists
(select d_name from department where d_id=1003);
)
mysql的四个隔离级别看了很多遍了。
ru,rc,rr,serialable
依次解决了,脏读,不可重复度,幻读的问题。
还有mysql索引的存储结构btree和b+tree区别,b+tree只有叶子节点才存储具体数据。