L
L
LearnJava
Search…
⌃K

Mysql优化

limit对于越大的offset查询越慢

场景:
导出数据的时候,利用select * from table limit ${offset},${limit},但是当offset越来越大的时候(比如100万),查询非常耗时。
解决思路:

组合主键不满足最左前缀

项目实践中,发现如果是组合主键的话,按照最左前缀去查询也不能使用到索引,不知为什么???所以一般最好建立组合索引去按照最左前缀查询。

修改组合索引顺序来满足最左前缀

项目中发现有大量下面的查询:
SELECT * FROM message WHERE from = :from AND to = :to AND seq IN (:seqs)
但是message表的组合索引为:
KEY `zuhe` (`id`,`from`,`to`,`seq`)
很明显无法满足最左前缀原则,由于id字段很少用到,我们将组合索引改为:
KEY `zuhe` (`from`,`to`,`seq`,`id`)
这样上面那么大量的查询就可以用到索引提高查询效率了。

分表

对于数据量较大的表可以进行分表,比如使用id%100分布到100张表里面,增加查询和插入效率。