写SQL的日常心得

  1. 在数据量很庞大,但是返回的数据是分页(几十条)时,可以采用内连接(和自己连接,以主键为基础),这样可以提前过滤掉很多数据,然后再和其它的表连接,这样的就可以省去多余的连接了。

    1. select
    2. `goods_spec`.`img_url`,
    3. `goods_spec`.`spec_no`,
    4. `goods_spec`.`spec_name`,
    5. `goods_goods`.`goods_no`,
    6. `goods_goods`.`goods_name`,
    7. `goods_spec`.`spec_id`,
    8. `goods_goods`.`brand_id`,
    9. `goods_goods`.`class_id`,
    10. `goods_spec`.`goods_id`
    11. from `goods_spec`
    12. join (
    13. select `goods_spec`.`spec_id`
    14. from `goods_spec`
    15. where (
    16. `goods_spec`.`spec_id` not in (
    17. 1484616, 1484615, 1484669, 1000504, 1484727, 1484726, 1484725, 1484724,
    18. 1484723, 1484722, 1484721, 1484720, 1484719, 1484718, 1484717, 1484716,
    19. 1484715, 1484714, 1484713, 1484712, 1484711, 1484710, 1484709, 1484708
    20. )
    21. and `goods_spec`.`deleted` = 0
    22. )
    23. order by `goods_spec`.`spec_id` desc
    24. limit 50
    25. ) as `alias_10041871`
    26. using (`spec_id`)
    27. left outer join `goods_goods`
    28. on `goods_spec`.`goods_id` = `goods_goods`.`goods_id`

    这条sql中,把条件和分页都写内联的表中,查出来的数据只有50条。然后再通过查出来的这50条主键信息过滤掉别的数据,效率会提升很多。

  2. 减少不必要的字段。在数据量达到一个级别(10万条)多查一个字段,消耗的时间也是十分明显的(5s),因此避免查询不必的字段是十分必要的。(不查询字段只查询数据条数速度特别快!)。