没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
31页
30条SQL优化建议SQL优化手册MySQL性能调优.docx,1、查询SQL尽量不要使用select *,而是select具体字段。2、如果知道查询结果只有一条或者只要最大/最小一条记录,建议用limit 1,3、3、应尽量避免在where子句中使用or来连接条件,4、优化limit分页,5、5、优化like语句,6、使用where条件限定要查询的数据,避免返回多余的行,7、7、尽量避免在索引列上使用mysql的内置函数,8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致系统放弃使用索引而进行全表扫,9,Inner join 、left join、right join,优先使用Inner join,如果是left join,左边表结果尽量小等
资源推荐
资源详情
资源评论
SQL 优化建议
常用 SQL 优化,避免慢查询语句
1、查询 SQL 尽量不要使用 select *,而是
select 具体字段。
反例子:
select * from employee;
正例子:
select id,name from employee;
理由:
� 只取需要的字段,节省资源、减少网络开销。
2、如果知道查询结果只有一条或者只要最大
/最小一条记录,建议用 limit 1
假设现在有 employee 员工表,要找出一个名字叫 jay 的人.
CREATE TABLE `employee` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`date` datetime DEFAULT NULL,
`sex` int(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
反例:
select id,name from employee where name='jay'
正例
select id,name from employee where name='jay' limit 1;
理由:
� 加上 limit 1 后,只要找到了对应的一条记录,就不会继续向下扫描了,效率将会大大
提高。
� 当然,如果 name 是唯一索引的话,是不必要加上 limit 1 了,因为 limit 的存在
主要就是为了防止全表扫描,从而提高性能,如果一个语句本身可以预知不用全表
扫描,有没有 limit ,性能的差别并不大。
3、应尽量避免在 where 子句中使用 or 来连
接条件
新建一个 user 表,它有一个普通索引 userId,表结构如下:
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) NOT NULL,
`age` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_userId` (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
假设现在需要查询 userid 为 1 或者年龄为 18 岁的用户,很容易有以下 sql
反例:
select * from user where userid=1 or age=18
正例:
//使用 union all
select * from user where userid=1
union all
select * from user where age = 18
//或者分开两条 sql 写:
select * from user where userid=1
select * from user where age = 18
理由:
� 使用 or 可能会使索引失效,从而全表扫描。
对于 or+没有索引的 age 这种情况,假设它走了 userId 的索引,但是走到 age 查
询条件时,它还得全表扫描,也就是需要三步过程: 全表扫描+索引扫描+合并如
果它一开始就走全表扫描,直接一遍扫描就完事。mysql 是有优化器的,处于效率
与成本考虑,遇到 or 条件,索引可能失效,看起来也合情合理。
4、优化 limit 分页
我们日常做分页需求时,一般会用 limit 实现,但是当偏移量特别大的时候,查询
效率就变得低下。
反例:
select id,name,age from employee limit 10000,10
正例:
//方案一 :返回上次查询的最大记录(偏移量)
select id,name from employee where id>10000 limit 10.
//方案二:order by + 索引
select id,name from employee order by id limit 10000,10
//方案三:在业务允许的情况下限制页数:
理由:
剩余30页未读,继续阅读
资源评论
随风浪仔
- 粉丝: 679
- 资源: 2082
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功