索引分两类聚集索引和非聚集索引
聚集索引决定数据在磁盘上的物理排序,叶子节点存储行记录,一个表只能有一个聚集索引。类似与字典目录索引。在innodb中主键索引是聚集索引(主键只是确定表格逻辑组织方式)。如果表没有定义主键,则第一个not NULL unique列是聚集索引, 否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
非聚集索引(二级索引):叶子节点存储聚集索引所覆盖的数据和主键值 ,有5种索引(普通索引、联合索引、哈希索引、全文索引、唯一索引)
普通索引:单个字段的b+树索引
联合索引:多个字段上建立的索引,最左匹配规则,能够加速复合查询条件的检索。
Hash索引:Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,只适用于等值查询的场景,没办法利用索引完成排序, 不支持多列联合索引的最左匹配规则。InnoDB用户无法手动创建哈希索引,这一层上说,InnoDB确实不支持。
InnoDB会自调优,如果判定建立自适应哈希索引,能够提升查询效率,InnoDB自己会建立相关哈希索引
全文索引(fulltext):通过关键字在词典中匹配来进行查询过滤,查询时格式match(field) against(待查字典字符串,逗号分隔)
唯一索引:与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一.主键索引是特殊的唯一索引, 不允许有空值。
回表查询:
先通过非聚集索引定位到主键值, 在通过聚集索引定位到行记录, 它的性能较扫一遍索引树更低。
索引覆盖:
如果select的列包含在所建的索引中,则直接在二级索引上就可以查到对应值,不需要通过rowId经过回表去查聚集索引。
索引条件下推(index condition pushdown):
存储引擎通过在二级索引(只在二级索引这生效)这里过滤主键值减少需要回表的次数,就不需要全部查询出来后在server端过滤。目标就是为了减少访问表的完整行数从而减少 I/O 操作。
慢查询开启:
两种方式一种修改配置,
另一种修改变量(变量重启失效)
set global slow_query_log='ON';
开启存储位置:
set global slow_query_log_file=‘地址’
设置超过多少时间即记录慢sql
set global long_query_time=设置秒;