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 后面的子查询别名问题
MySQL的delete语句必须加from
MySQL的delete语句表名加别名,前面也需要加别名:
例如: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前后的两个条件中的列都有索引时,查询中才使用索引。否则,查询将不适用索引。