该篇主要介绍一些常用的sql优化技巧
建议将*改为需要的列。这对速度不会有明显的影响,主要考虑节省内存。
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
select * from users where YEAR(adddate)<2007;
将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成
select * from users where adddate<‘2007-01-01’;
NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。
当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了。
这里最主要的问题是,对于程序员来说,这个事情是很容易被忽略的。因为,我们某些查询语句会让MySQL不使用缓存。请看下面的示例:
这样使用只让你的数据库的性能呈指数级的下降。这里的问题是:MySQL会不得 不去执行RAND()函数(很耗CPU时间),而且这是为了每一行记录去记行,然后再对其排序。就算是你用了Limit 1也无济于事(因为要排序)。
在分页的时候,当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,来记录上一页最后一行排序编号,然后通过该参数范围查找下一页的记录。
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‘);
http://www.cnblogs.com/daxian2012/articles/2767989.html
http://blog.csdn.net/jetxt/article/details/5992360
原文地址:http://blog.csdn.net/pursuing0my0dream/article/details/46289611