SQL优化

插入数据优化

  • 批量插入,insert

  • 手动事务提交

  • 主键顺序插入

大批量插入数据,通过load指令将本地文件一次性加入到数据库中。

本地文件可以是csv,excel,sql文件等

主键优化

表数据都是根据主键顺序组织存放的,这种存储方式的表成为索引组织表(index organized table IOT)

插入时,如果主键不是按照顺序插入的,可能会出现页分裂。需要向一个数据page中插入时,空间不足,需要申请新的数据page,并进行数据的copy和移动,带来不必要的存储和性能开销。

主键的设计原则

  • 在满足业务需求的情况下,尽量降低主键的长度。

  • 插入时,尽量选择顺序插入,选择使用自增主键

  • 尽量不要使用其他uuid做主键或者其他自然主键,如身份证号

  • 业务操作时,尽量避免对主键修改

OrderBy优化

排序有两种方式

  • Using filesort:通过表的索引或者全表扫描,读取满足条件的数据行,然后在排序缓冲区sort buffer中完成排序操作,所有不是通过索引直接返回排序结果的排序都叫做filesort排序

  • Using index:通过有序索引顺序扫描返回有序数据,这种情况即为using index,不需要额外排序,操作效率高。

order by的字段的顺序会影响使用索引的情况(最左前缀匹配)

可以在创建索引时指定排序方式。

如果没有使用覆盖索引,那么会使用filesort的方式

Group By优化

创建索引优化性能。注意:

  • 如果使用联合索引,需要满足最左前缀匹配,这个的字段可以出现在where子句中也可以出现在group by的字段中

limit优化

在大数据场景下,如果不建立索引,limit的起始位置越靠后,所需要的时间就越久。

此时可以考虑连表查询,利用聚合索引,只获取id,然后拿到id后再去查表得到数据的具体内容

count优化

count某个字段,如果字段值为null,则不会被count,否则被count记录(count++)

按照效率排序:

count(字段) < count(主键id) < count(1) ≈ count(*)

Update优化

行锁概念

执行update时,符合where条件的行会被锁住,其他行仍然还可以进行操作

如果where查询的字段没有索引,那么会直接进行表锁,而非行锁

上面两个语句,第一个语句为行锁,第二个语句则会表锁

最后更新于

这有帮助吗?