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也可以

 

7.尽量使用in运行符来替代or运算

比较以下两种SQL语句书写方式,发现方式二的效率更高
方式一:select * from t where id=1 or id=2 or id=3;
方式二:select * from t where id in (1,2,3);

 

8.条件列表值如果连续使用between替代in

从t表中仅要找出id值为1,2,3的行,因为id值连续,可以使用以下第三种方式书写SQL语句:

  • 方式三:select * from t where id between 1 and 3

 

数据库怎么优化查询效率?

储存引擎选择:如果数据表需要事务处理,应该考虑使用 InnoDB,因为它完全符合 ACID 特性。
如果不需要事务处理,使用默认存储引擎 MyISAM 是比较明智的
分表分库,主从。
对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
Update 语句,如果只更改 1、2 个字段,不要 Update 全部字段,否则频繁调用会引起明显的性能消耗,同时带来大量日志
对于多张大数据量(这里几百条就算大了)的表 JOIN,要先分页再 JOIN,否则逻辑读会很高,性能很差。

 使用多列索引的查询语句。mysql可以为多个字段创建索引。一个索引可以包括16个字段。对于多列索引,只有查询条件中使用了这些字段中第1个字段的时候,索引才会被使用

使用or关键字的查询语句。使用语句的查询条件中只有or关键字,且or前后的两个条件中的列都有索引时,查询中才使用索引。否则,查询将不适用索引。

posted @ 2020-07-08 16:32  林被熊烟岛  阅读(298)  评论(0编辑  收藏  举报