面试题
知道什么是覆盖索引吗?
覆盖索引是指,查询使用的索引,需要返回的列,在该索引的叶子节点中已经能够全部找到。
简单的来说,覆盖索引就是查询索引后,已经得到了所需字段的信息,不需要回表查询。
引生出的两个小问题:
- 用id查询,就能直接走聚簇索引,只需要一次索引扫描,就能得到需要的数据,性能高
- 如果返回的列中没包含所有需要的列,就有可能会触发回表查询,所以尽量避免使用select *
MySQL超大分页怎么处理?
问题:
数据量比较大时,limit分页查询,需要对数据进行排序,效率低。
比如说limit 9000000, 10, 此时MySql需要排序前9000010记录,但只返回最后10条记录,其他记录丢弃,排序的代价很大。
优化思路:
select * from tb_sku limit 9000000, 10;
select * from tb_sku t, (select id from tb_sku order by id limit 9000000, 10) a
where t.id = a.id;
索引创建的原则
一般来讲,就是表中的数据超过10万以上,才会创建索引。
1.数据量较大,且查询比较频繁的 表
2.常作为where,order by,limit的字段
3.尽量使用联合索引
4.如果一个字段的内容较长,也可以用前缀索引
5.要控制索引的数量,因为添加索引会导致增删改的速度变慢
什么情况下索引会失效?
1.用到复合索引(联合索引)时,违反最左前缀法则
2.范围查询右边的列,不能使用索引
3.在索引列上进行运算操作,索引将失效
4.字符串不加单引号,会类型转换,造成索引失效
5.以%开头的like模糊查询,会造成索引失效
谈一谈你对sql优化的经验
1.表的设计优化(参考阿里的开发手册)
2.索引优化,创建索引原则
3.sql语句优化,避免使用select *,避免索引失效…
4.主动复制,读写分离。目的是不让数据的写入影响读操作
5.分库分表