(103)mysql优化之sql语句优化

概述

该篇主要介绍一些常用的sql优化技巧

sql优化

1.select * from table_name where;

建议将*改为需要的列。这对速度不会有明显的影响,主要考虑节省内存。

2.like语句

一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。

3.不要在列上进行运算,无法运用索引

select * from users where YEAR(adddate)<2007;

将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成

select * from users where adddate<‘2007-01-01’;

4.不使用NOT IN和<>操作

NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。

5.为查询缓存优化你的查询

当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。
这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例:


这里写图片描述

6.千万不要 ORDER BY RAND()

这样使用只让你的数据库的性能呈指数级的下降。这里的问题是:MySQL会不得 不去执行RAND()函数(很耗CPU时间),而且这是为了每一行记录去记行,然后再对其排序。就算是你用了Limit 1也无济于事(因为要排序)。

7.limit huge_num,offset

在分页的时候,当huge_num比较大的时候,这样分页有一个很大的性能问题。我用‘limit 1000,20;’去1000-1020行的记录,会遍历1020行,然后前1000条记录都会被抛弃。

SELECT * FROM payment ORDER BY rental_id LIMIT 100,10;

思路一:使用子查询,按照索引分页后回表方式改写sql

SELECT * FROM payment a INNER JOIN (SELECT payment_id FROM payment ORDER BY rental_id LIMIT 100,10)b ON a.payment_id = b.payment_id;

思路二:使用between ... and...

#不建议,用处不大
SELECT * FROM payment WHERE rental_id BETWEEN 100 AND 110 ORDER BY rental_id;

思路三:和开发人员协商,翻页过程通过增加一个参数last_page_record,来记录上一页最后一行排序编号,然后通过该参数范围查找下一页的记录。

8.使用count(),而不是count(id);*

9.批量插入

insert into t(id,name) values(1,'test1');
insert into t(id,name) values(2,'test2');
insert into t(id,name) values(3,'test3');

#改为

insert into t(id,name) values(1,'test1'),(2,'test2'),(3,'test3');

10.order by 减少filesort排序,通过索引直接返回有序数据

参考

http://www.cnblogs.com/daxian2012/articles/2767989.html
http://blog.csdn.net/jetxt/article/details/5992360

你可能感兴趣的:((103)mysql优化之sql语句优化)