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來實現高效查詢,列式儲存和數據分區與線程并行