SQL优化很容易理解,就是通过给查询字段添加索引或者改写SQL提高其执行效率,一般而言,SQL编写有以下几个通用的技巧:
SQL优化
- 合理使用索引
索引少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能 选择率高(重复值少)且被where频繁引用需要建立B树索引;一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况
- 使用UNION ALL替代UNION
UNION ALL的执行效率比UNION高,UNION执行时需要排重;UNION需要对数据进行排序
- 避免select * 写法
执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。
- JOIN字段建议建立索引
一般JOIN字段都提前加上索引
- 避免复杂SQL语句
提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理
- 避免where 1=1写法
- 避免order by rand()类似写法
RAND()导致数据列被多次扫描
查看执行计划
要想优化SQL必须要会看执行计划,执行计划会告诉你哪些地方效率低,哪里可以需要优化。我们以MYSQL为例,来认识一下执行计划。
通过explain sql 可以查看执行计划,如:
索引
创建唯一索引:
CREATE UNIQUE INDEX 索引名_IDX USING BTREE ON 表名 (字段);
显示索引名
show index from 表名;
创建索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )
未加索引前:
加索引后执行sql计划
explain
select * from A
where org_code = '1025' and is_valid = 1
and B in ('1','2','3');
删除索引
ALTER TABLE 表名 DROP INDEX idx_bar;
DBA建议
-
当这个字段的值重复度很高的时候,也就是你说的枚举,单独建索引效果没多少。。但是你这个是加的联合索引,可以加进去,不加也无妨
-
索引和是否分表是没有关系的,索引是在表上加的,加快查询;分表是为了减小单表的数据量,因为数据量大了,查询同样也会很慢,当很大很大的时候,用索引都不会有效果
-
建索引的时候,把barcode放前面,可以测试一下,看看只建barcode和建三个字段的联合索引,有什么区别,用explain执行看一下结果
-
update、delete、select的结果数据量如果很多,即使有索引也是会很慢的
-
可以优化代码,选择少量多次更新,update 10000条数据是一个大事务,大事务发送到数据库上,不是一个好的选择
-
比如像select limit 分页查询,用循环实现批量delete/update,这样就做到了少量多次