设为首页 加入收藏

TOP

(3)mysql优化之sql语句优化
2015-07-24 11:53:56 来源: 作者: 【 】 浏览:4
Tags: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排序,通过索引直接返回有序数据

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇MySQL优化之――视图 下一篇MySQL详解(9)----------索引详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何理解智能指针? (2025-12-24 12:48:26)
·c++是否应避免使用普 (2025-12-24 12:48:23)
·如何通俗易懂学会 C+ (2025-12-24 12:48:21)
·在 C 语言函数中,如 (2025-12-24 12:19:41)
·C盘里面的AppData文 (2025-12-24 12:19:38)