Home  >  Q&A  >  body text

php - 一道MySQL优化查询的面试题

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

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

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

PHPzPHPz2722 days ago1867

reply all(21)I'll reply

  • 黄舟

    黄舟2017-04-10 15:45:26

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

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 15:45:26

    使用SQL的查询缓存试试?

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 15:45:26

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

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:45:26

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

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

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 15:45:26

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

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:45:26

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

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:45:26

    妥妥的分表啊!

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:45:26

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

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:45:26

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

    reply
    0
  • 黄舟

    黄舟2017-04-10 15:45:26

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

    reply
    0
  • Cancelreply