前几天面试碰到一个数据库(MySQL)优化查询的问题:
说一张表里有1千万条数据,有一个字段status有两个值(1待审核、2审核通过),然后呢有两个列表即待审核列表与审核通过的列表,那么如何优化查询SQL使其列表的查询速度达到最快?
我没答上来,其实我本来想说给status字段加索引,但细想由于它的值重复性太多,即使加了索引效果也不明显,所以我不知道如何去优化这样的查询。
ringa_lee2017-04-10 15:45:26
分表,如将其他字段根据尾数进行分表,这样查询的时候根据其尾数决定去哪个表查询。
不过这有一个前提就是分表的字段值分布够均匀,这样前面的分表方式就可以将记录均分到各个表。
伊谢尔伦2017-04-10 15:45:26
1.分表
2.我隐约记得以前看过一本书 上面写这种字段要定义成SET.然后加上索引, 可以改善存储性能和查询速度.不过我自己没有亲自试验, 所以只是一个建议.
PHP中文网2017-04-10 15:45:26
楼主的意思应该是,将有1千万数据的原始表,按照status字段统计到审核表和待审核两个表中吧。
如果是这样,其实sql是没太大的优化余地, 就select a, b from xxxtb where status = 0. 就像你说的,status索引用了和没用差不多了,所以,我认为sql优化,没啥好优化的。
其他思路提供:
1、分表统计
2、利用计划任务,用程序统计。
天蓬老师2017-04-10 15:45:26
不是必要,基本不考虑分表,千万级别的数据分表所带来的操作逻辑复杂程度远大于提升的效率,对于这种数据查询一般的解决方案分批次处理数据,比如按时间或性别等一部分一部分处理,建好适当的主键,其次就是减少不必要的返回字段
黄舟2017-04-10 15:45:26
我有一个思路,就是分表,再加两张表,一张status_1一张status_2,两张表存储主表的id,然后直接做关联查询,这样理论上效率要高一点吧。有高手可以帮忙测试一下