zoukankan      html  css  js  c++  java
  • 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前后的两个条件中的列都有索引时,查询中才使用索引。否则,查询将不适用索引。

  • 相关阅读:
    Mac终端学习C笔记
    苹果双系统win8.1遇到的一些问题
    初学者Android studio安装
    java八种排序算法---直接插入排序
    java八种排序算法---快速排序
    java的八种排序算法---冒泡排序
    转利用 NPOI 變更字體尺寸及樣式
    AJAX 跨域调用WEB API(转)
    常用C#字符串函数大全
    C# 发送邮件整理,包括控制台程序、WPF、WebForm 及 ASP.NET MVC
  • 原文地址:https://www.cnblogs.com/linhongwenBlog/p/13267714.html
Copyright © 2011-2022 走看看