内容来自《收割Offer:互联网大厂面经》

面试官提问● 选择什么样的列作为索引?如何优化索引?● 什么是最左前缀匹配原则?● 什么是索引覆盖?● 自增主键与UUID作为主键,哪个好?● 分库分表怎么保证唯一索引?

(1)最左前缀匹配原则:索引查询会一直向右匹配,直至遇到范围查询(>、<、between、like)才停止匹配,这一条的详细解释见1.2.17节。

(2)选择区分度高的列作为索引,区分度计算如下:

    count(distinct col)/count(*)

字段属性值不重复的比例越大,SQL查询需要扫描的记录数越少。比如,性别与姓名这两个索引字段,姓名的区分度远远高于性别,因下面SQL1的查询性能远好于SQL2。

    SQL1: Select * from tableName where name = ‘张三’
     SQL2: Select * from tableName where sex = ‘M’

(3)索引列不要参与计算,保持列“干净”。

   SQL1  : select * from   tableName    where    from_unixtime(createTime)  =
‘2023-01-01’
    SQL2:select * from tableName where createTime = unix_timestamp(’
2023-01-01’)

B+树中存储的是数据表中的字段值,SQL1中的所有元素值经过时间函数处理后才能进行比较,因此SQL1无法使用索引,改写成SQL2即可。

(4)利用索引覆盖进行查询,避免二次回表,减少select *的使用。索引覆盖的详细讲解见1.2.19节。

(5)建议使用自增主键(不推荐使用UUID作为主键),数据的新增会更新B+树索引,非自增主键在数据插入时可能使节点分裂更频繁。