1.在回表数据量不大的情况下考虑增加索引,如果有多个筛选条件的情况下可以考虑添加联合索引,并且满足最佳左前缀的原则。
2.避免全表查询返回不需要的字段,增加磁盘io的压力
3.大表的分页查询,limit越大效率越低,可以先查主键id再查数据
SELECT * FROM t ORDER BY create_time LIMIT 1000000, 100;
select * from t ,(select id from t order by create_time limit 1000000,100) a where t.id = a.id;
4.根据id的奇偶性,也可以按照日期或者地点水平分表,也可以考虑把一张字段很多的表垂直拆分成两个小表
5.数据库的字段设计char代替varchar,数字类型代替字符类型,datetime选择
6.热点数据缓存到redis中,减少对查询对数据库的压力
7.用es把常用的id同步到es中,这样可以提供更高效的查询
8.数据冷热分离,把数据按照查询频率分配到固态或者机械硬盘上
9.数据仓库clickhouse来实现高效查询,列式储存和数据分区与线程并行