生死看淡,不服就干。SQL常见的一些优化。
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句。
索引问题
经常发现有很多后台程序的性能问题是因为缺少何时索引造成的,有的表甚至没有索引。这种情况往往是因为在设计表时,没有定义索引,而开发初期,由于表中的数据不多,所以感觉不到索引对性能的影响,但是一旦项目发布,表中数据多了之后,缺少索引对性能的影响便会越来越大。
还有不要在建立索引的数据列上进行一下操作:
SQL语句模型结构优化
a. ORDER BY + LIMIT组合的索引优化
b. WHERE + ORDER BY + LIMIT组合的索引优化
c. WHERE+ORDER BY多个栏位+LIMIT
where子句使用IN 或 NOT IN的优化
in和not in 也要慎用,否则也会导致全表扫描。
limit分页优化
删除重复记录:
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
用TRUNCATE替代DELETE:
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短。(TRUNCATE只在删除全表适 用,TRUNCATE是DDL不是DML)。
使用表的别名
当在SQL语句中有连接多个表的时候,请使用表的别名并把别名的前缀置于每个列名上,这样就可以减少解析的时间并减少那些有列名歧义引起的语法错误。
使用用户自定义变量
用户自定义变量是一个用来存储内容的临时容器,在 MySQL 连接的整个过程都存在,可以使用 set 和 select 来定义:
之后可以在任何使用表达式的地方使用自定义变量:
在下列情况下不能使用自定义变量:
a) 使用自定义变量的查询,不能使用缓
b) 不能在使用常量或标识符的地方使用自定义变量,如表名,列名,limit 子句
c) 自定义变量只在一个连接中有效,不能作为连接间的通信
d) MySQL优化器在某些场景下会将这些变量优化掉,会导致不同的预期结果
1:自定义变量可以在给变量赋值的同时使用这个变量,如java的a =a+1 操作。
如实现行号的功能
2:避免重复查询刚刚更新过的数据
如果想在更新行的同时又希望获取该行的信息,则可以使用自定义变量实现
方式一:update 之后,在 通过 select 查询
方式二:定义自定义变量
这两种方式仍然需要两次网络来回,但是第二种方式不需要访问数据表,因此会很快。