1 .什么是索引,先举个例子吧。 词典应该大家都用过。 使用目录可以快速导航到您要找的东西。 然后,索引的作用类似于目录。 在数据库表记录中,通过利用索引,可以快速过滤和找到数据记录。
2 .索引类型分类
2.1常规索引
加快查询速度
2.2唯一索引
查询速度加快,列值的唯一性受到限制,可以允许为空
唯一索引包括联合唯一索引和由多个列组成的唯一索引。 这些列可以唯一确定单个表记录并将其设置为null
2.3全文索引
主要对文本内容进行分词,加快查询速度
2.4合并索引
在由多列组成的索引中,查询效率比多列索引集成更高
2.5主键索引
唯一性、查询加速、不能为空
3 .索引结构分类
索引有多种分类,包括B-tree索引、散列索引和全文索引。 由于索引实现是存储引擎层,而不是后端服务器层,因此存储引擎支持的索引结构不一定相同
3.1 B-树索引
B-tree索引广泛存在于存储引擎中,使用B-tree数据结构存储数据。 如果你熟悉树数据结构,你就会发现B-tree索引的好处。 每个叶节点都包含指向以下节点的指针,以便于查询数据
B-tree适用于所有键值、键值范围或前缀搜索
3.2散列索引
哈希索引基于哈希表实现,对于每行中的数据,存储引擎为所有索引列计算舒适的爆米花,存储引擎根据该舒适的爆米花搜索数据。 小编感觉很像HashMap插槽的查询处理
3.3全文索引
全文索引在几种索引结构类型中很特殊,他在寻找文本中的关键字
4 .索引的正确使用
索引是在系统文件中创建的,占用一定的内存空间。 此外,索引必须正确使用,因为数据在更新时会保留索引并消耗内存。 索引并不是越多越好,需要根据具体的查询业务修订索引的创建。
建议不要使用索引的几种情况:
1 .性别sex等区分度不是很大的字段
2 .经常更新的字段
3 .字符串型字段或文本型字段
未出现在where列中的索引
索引失效的几种情况:
1 .查询列中有函数计算
2 .查询列中有一个模糊查询。 “%cloum”可以用“cloum%”替代。 如果使用“%column%”,则在选择列中有索引列
3 .如果查询条件具有or,则除非所有条件都有索引,否则索引将无效
4 .使用不等于(!=或)
5. is null或is not null
6 .如果字符串不加引号,索引将无效
7 .最左原则,合并索引遵循最左原则。 即,使用连接索引时,前面的索引列必须包含。 举个例子,
如果存在联合索引(a,b,c ),则查询条件只能是a=1或a=1 and b=1或a=1 and b=1 and c=1。 否则,索引将无效
5 .扩展分析查询sql
select_type :
简单查询SIMPLE: 不包括子查询、相关查询等
如果PRIMARY:查询包含复杂的部分,则最外面的查询被标记为PRIMARY
SUBQUERY:子查询中的第一个查询
UNION:相关查询,最后一个。
type :查询语句的性能:按allindexrangeindex _ mergerefeq _ ref constant/system的顺序增加
All:全表扫描,性能最高
索引:所有索引列扫描
range:在单个索引列上执行范围搜索,或者between and或in或!=
index_merge:多个索引集成查询
ref:基于单个索引进行搜索
连接eq_ref:时使用主密钥或unique类型
常数:
系统:系统
possible_keys:中可用的索引
key:实际使用的索引
key_len:使用的索引长度
rows :扫描的行数
extra :包含用于解析查询的MySQL详细信息
6 .滚动查询日志
滚动查询日志是指mysql查询时间超过一定阈值的查询记录,默认时间为10秒,mysql默认情况下不打开滚动查询
默认值: showvariableslike ' % slow _ query _ log % '
设置全局变量名称=手动打开值
设置全局slow _ query _ log=on; 手动打开滚动查询日志
设置全局long _ query _ time=10; 手动设置超过查询时间的值,超过时记录查询日志
set全局slow _ query _ log _ file=' g :varslow _ log.txt '; 手动设置滚动查询日志的记录地址
set全局log _ queries _ not _ using _ indexs=on; 手动设置是否记录查询中用于索引的记录