SQL优化——select

MYSQL优化实施方案:https://www.cnblogs.com/clsn/p/8214048.html

  1. 对查询时经常用到的字段建立索引,如包含多个也可以构建复合索引,建立索引之后需要注意的一点是,查询时要确保和设计字段的格式是一致,如

    SELECT * FROM TABLE WHERE USER_ID = 12345

    这里USER_ID的类型是NUMBER,而实际设计表时如果USER_ID的类型是VARCHAR时,这里索引就会用不到,从而造成全表扫描。如发现查询时间过长,可以用

    explain SELECT * FROM TABLE WHERE USER_ID = 12345

    来查看明细

  2. 当表过大时,可以将老数据,历史数据进行归档(前提这些数据以后不用),减少数据量!!

  3. 经常用到的查询,或者较为复杂的查询时(多个表的联合查询)可以创建视图。

    视图的优缺点:

    优点:

    • [ ] 视图提供表的抽象。可以轻松地在视图中添加/删除字段,而无需修改基础架构。
    • [ ] 视图可以很容易地建模复杂的连接。。
    • [ ] 视图可以对你隐藏特定于数据库的内容。例如,如果需要使用Oracles sys进行一些检查_上下文函数或许多其他东西
    • [ ] 可以轻松地在视图上直接管理你的授权,而不是实际的表。如果知道某个用户可能只访问某个视图,则更容易管理。
    • [ ] 视图可以帮助你实现向后兼容性。可以更改基础架构,但视图可以向某个客户端隐藏这些事实。(比较常见的应用就是校园数据库中,学生表中存有班级、学分、学费、杂费等数据,然而对于老师的办公室中的应用来说,不该让他们看到学费、杂费之类的会计方面的数据,那么就不给他们此表的访问权限,而单独给他们一个河蟹过的视图,)

    缺点:

    • [ ] 将丢失有关关系的信息(主键、外键)
    • [ ] 不清楚是否能够插入/更新视图,因为视图对你隐藏了它的底层联接
  4. 尽量不要有空判断的语句,空判断会导致全表扫描,对于空判断这种情况,可以考虑对这个列创建数据库默认值。

  5. 尽量不用不等于条件,这样容易导致全表扫描,尽量使用范围查询。

  6. 尽量使用exists代替In,或者用外连接代替in

  7. 尽量不用or条件,会导致全表扫描,可以分开查询然后union all

  8. 分库分表

  9. 左模糊查询尽量不要使用,会引起全表扫描

  10. 理论上尽量多使用多表查询(left),少使用子查询

  11. WHERE子句中的连接顺序.:
    ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾.

  12. 优化group by,提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉。

猜你喜欢

转载自www.cnblogs.com/vitasoy/p/11873051.html