mysql-sql性能优化

1 .MySQL中不要出现过多的嵌套,增加冗余来达到简化sql语句的效果

例如:问题管理流程业务表需要取同一个环节最后一次处理该环节的信息.
1、 先取到最大时间 begin_time
2、 再取最新的process_no

例如:SELECT MAX(a.process_no) FROM sp_process a
        WHERE a.begin_time =
                (SELECT b.begin_time FROM sp_process b
                        WHERE b.item_code = 230
                        ORDER BY b.begin_time DESC LIMIT 1)
                        AND a.item_code=230

 

2.Like操作

一般情况下不鼓励使用like操作,like ?a%” 不会使用索引,而like aaa%”可以使用索引

 

 

3 不要再列上进行运算,会使索引失效

 

例如:如果查询2013年以来的问题管理工单:

 

SELECT * FROM sp_issue a WHERE YEAR(a.`oper_time`) > 2013; 这样写将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成 SELECT * FROM sp_issue a WHERE a.`oper_time` > ‘2013-01-01‘;

 

4 索引列排序

MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引

 

5 from 后面的子查询别名问题

MySQLdelete语句必须加from

MySQLdelete语句表名加别名,前面也需要加别名:

例如:DELETE FROM t1 a;--存在问题

正确写法:DELETE a FROM t1 a;

DELETE a FROM SP_PROCESS_OPER a WHERE a.app_no = ‘0008695930‘;

 

6 MySQL连接符问题与NULL处理

MySQL不能使用“||”进行字符串连接操作,在mysql中“||”和“&&”代表逻辑or和and的意思。使用concat连接.

注意一下,MySQ concat函数连接字符串的时候,如果字符串有null值,最后连接结果也是null,而oracle是不一样的。

mysql

SELECT  CONCAT(‘aa‘,‘bbb‘,‘ccc‘,null) 结果为空

oracle

select  ‘aa‘||‘bbb‘||‘ccc‘||null from dual

结果为 aabbbccc

MySQ中的null和‘’(空值)是不一样的

select concat(col1,col2,...,case when coln is null then ‘‘ else coln end coln) from tableName;

MySQL实现Oracle的decode功能是用case when来实现

ifnull也可以

 

mysql-sql性能优化

上一篇:可视化数据库管理工具DataGrip使用详解


下一篇:004.Linux之Mysql安装