内容来自《收割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+树索引,非自增主键在数据插入时可能使节点分裂更频繁。