5.4 商品列表与详情
1. 数据库索引
工具 EXPLAIN + SQL语句
如下图是没有走索引的SQL语句:
下图用到主键索引:
-
索引分类:普通索引、唯一索引、全文索引(一般使用ElasticSearch)、空间索引
-
存储方式:B-Tree(Innodb使用B+树)、Hash
-
数据分布:聚簇索引(指的是把数据和索引聚在一起,直接都存到叶子节点)、二级索引
-
回表情况:覆盖索引(或叫索引覆盖)
覆盖索引的定义:索引覆盖就是一个SQL在执行时,可以利用索引来快速查找,并且此SQL所要查询的字段在当前索引对应的字段中都包舍了,那么就表示此SQL走完索引后不用回表了,所需要的字段都在当前索引的叶子节点上存在,可以直接作为结果返回了
2. 最左前缀原则
表table T, 索引index (a,b,c)
-- 全值匹配
select * from T where a='' and b='' and c=''; -- Y(可以走索引)
select * from T where c='' and b='' and a=''; -- Y
-- 匹配左前缀
select * from T where a=''; -- Y
select * from T where b=''; -- N
-- 匹配列前缀
select * from T where a like 'x%'; -- Y
select * from T where a like '%x'; -- N (一定要从开头开始匹配)
select * from T where b like 'x%'; -- N
-- 匹配范围值
select * from T where a between '' and ''; -- Y (使用第一个索引a就可以)
select * from T where b between '' and ''; -- N
-- 全值匹配 + 范围匹配
select * from T where a='' and b between '' and ''; -- Y
select * from T where b='' and c between '' and ''; -- N
select * from T where a between '' and '' and b=''; -- N
3. 慢查询分析
启动慢查询:
设置查询时间长于一秒的为慢查询,记录到日志:
面试官:项目怎么调优?
数据库方面:启动慢查询日志(如上的操作),然后再将日志中的耗时较长的sql,再通过EXPLAIN看是否有加索引,加了索引的话是否又遵循最左前缀原则