• SQL性能优化的几点建议


    1. 索引:
    索引可以提高查询的速度,但不是使用带有索引的字段查询时,索引都会起作用,如下几种特殊情况下,有可能使用带有索引的字段查询时,索引没有起作用:
    1)使用LIKE关键字的查询语句
      如果匹配字符串的第一个字符为“%”,索引不会起作用,只有“%”不在第一个位置,索引才会起作用
    2)使用多列索引的查询语句
      Mysql可以为多个字段创建索引,一个索引可以包括16个字段,对于多列索引,只有查询条件中使用了这些字段中的第一个字段后时,索引才会被使用。
    3)使用OR关键字的查询语句
      查询语句的查询条件中只有OR关键字,且OR前后两个条件中的列都是索引时,查询中才使用索引,否则查询将不使用索引。

    2. 不同SQL语句的优化方法
    1)INSERT语句
      a) 一次性批次插入多行数据与多次分别插入相比,将大大缩短客户端与服务器之间的连接和关闭等操作,如:

      insert into books values (1,"book1"), (2, "book2"), (3, "book3");

      b) 通常可以锁定表以加速插入数据,如下:

      lock tables books;
      insert into books values (1,"book1"), (2, "book2"), (3, "book3");
      unlock tables;

    2) ORDER BY语句
    通常使用索引来对ORDER BY语句进行优化,几个常用的例子如下:
    a) ORDER BY + LIMIT 组合的索引进行优化,如:

    select id, name, age from user order by id limit 0,15; ---只需在id上建立索引即可

    b) WHERE + ORDER BY + LIMIT 组合的索引优化,如:

    select id, name, age from user where name="lilei" order by id limit 0,15;---此时如果只对id添加索引,效率不是很高,此时可以建立一个联合索引(id,name)
    

    c) 不要对WHERE 和 ORDER BY的选项使用表达式或者函数,如:

    select id, name, age from user order by max(id) limit 0,15;
    

    下面这几种情况下不适合使用索引:

    a)ORDER BY的字段使用 asc、desc
    b) WHERE 子句使用的字段和ORDER BY的字段不一致,如:

    select id, name, age from user where name="lilei" order by id;
    

    c) 对不同给的关键字使用ORDER BY排序,如:

    select id, name, age from user order by id, name;

    3) GROUP BY语句
      使用GROUP BY语句时,Mysql会对符合的结果自动排序,通过扫描整个表并创建一个新的临时表,表中每个组的所有行应为连续的,然后使用该临时表来找到组并应用累计行数,
    在某些情况下,Mysql可以通过索引访问而不使用临时表。通过制定 GROUP BY NULL来禁止排序, 从而可以节省损耗。

    4)优化嵌套查询
    可以使用连接(JOIN)来代替子查询(内层嵌套的select语句),连接查询不需要建立临时表,其查询速度比子查询要快,如果查询中使用索引的话,性能会更好。

    补充一下join及union的区别:

    (1)union对两张表的操作是合并数据条数,等于是纵向的,要求是两张表字段必须是相同,

      也就是说如果A表中有三条数据,B表中有两条数据,那么A union B就会有五条数据。

      (union 和union all的差别,对于union如果存在相同的数据记录会被合并,而union all不会合并相同的数据记录,该有多少条记录就会有多少条记录。)

    (2)join偏于横向的联合。join跟union比起来显得更宽松,对两个表的字段不做要求,没有限制条件的join等于两个表的笛卡尔乘积,所有join需要有限制条件来约束,经过限制的join就是横向的扩张了。
    5)优化OR条件
    对于使用OR条件的子查询,如果要使用索引,则OR之间的每个条件列都必须使用到索引,创建索引后,是对OR的各个字段在查询结果后在进行UNION操作。

  • 相关阅读:
    AI零基础入门之人工智能开启新时代—下篇
    AI零基础入门之人工智能开启新时代—上篇
    Markdown 快速入门
    Linux GCC/G++ 基础(1) 之
    解决 Ubuntu 下使用 sublime text 3 无法输入中文
    WPF:界面布局之- TaiChi
    常用命令之- touch
    微软net平台是不是快完了?看了一天智联招聘,现在连传统的网站或系统平台都不怎么用net了
    蓝牙Ble开发(支持API18<Android 4.3 Jelly>及以上)
    Android系统休眠对程序的影响以及处理
  • 原文地址:https://www.cnblogs.com/hunterCecil/p/7989098.html
Copyright © 2020-2023  润新知