KEEP ON CODING......

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操作。

posted @ 2017-12-05 20:05  Cecil2020  阅读(158)  评论(0编辑  收藏  举报