php - 一道MySQL优化查询的面试题
PHPz
PHPz 2017-04-10 15:43:26
0
21
2005

前几天面试碰到一个数据库(MySQL)优化查询的问题:

说一张表里有1千万条数据,有一个字段status有两个值(1待审核、2审核通过),然后呢有两个列表即待审核列表与审核通过的列表,那么如何优化查询SQL使其列表的查询速度达到最快?

我没答上来,其实我本来想说给status字段加索引,但细想由于它的值重复性太多,即使加了索引效果也不明显,所以我不知道如何去优化这样的查询。

PHPz
PHPz

学习是最好的投资!

Antworte allen(21)
黄舟

如果是myisam表的话,是不是可以考虑组合索引?id和status作为主键。

巴扎黑

使用SQL的查询缓存试试?

大家讲道理

撇开这道题,大部分情况下我们只需要用到前几页,我觉得缓存一个id范围,查询的时候带上即可!

左手右手慢动作

分表,如将其他字段根据尾数进行分表,这样查询的时候根据其尾数决定去哪个表查询。

不过这有一个前提就是分表的字段值分布够均匀,这样前面的分表方式就可以将记录均分到各个表。

伊谢尔伦

1.分表
2.我隐约记得以前看过一本书 上面写这种字段要定义成SET.然后加上索引, 可以改善存储性能和查询速度.不过我自己没有亲自试验, 所以只是一个建议.

小葫芦

状态分表,条目不物理删除,查询时分页与否都只用id查询。

洪涛

妥妥的分表啊!

Ty80

楼主的意思应该是,将有1千万数据的原始表,按照status字段统计到审核表和待审核两个表中吧。
如果是这样,其实sql是没太大的优化余地, 就select a, b from xxxtb where status = 0. 就像你说的,status索引用了和没用差不多了,所以,我认为sql优化,没啥好优化的。
其他思路提供:
1、分表统计
2、利用计划任务,用程序统计。

Peter_Zhu

不是必要,基本不考虑分表,千万级别的数据分表所带来的操作逻辑复杂程度远大于提升的效率,对于这种数据查询一般的解决方案分批次处理数据,比如按时间或性别等一部分一部分处理,建好适当的主键,其次就是减少不必要的返回字段

黄舟

我有一个思路,就是分表,再加两张表,一张status_1一张status_2,两张表存储主表的id,然后直接做关联查询,这样理论上效率要高一点吧。有高手可以帮忙测试一下

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage