sql语句的优化
1 开启慢查询
在mysql下查询
mysql> show VARIABLES like '%slow%';
+---------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------+
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| slow_launch_time | 2 |慢查询的
阈值,超过这个值认为是慢查询
| slow_query_log | OFF |慢查询是
关闭的
| slow_query_log_file | /var/lib/mysql/ubuntu-slow.log |慢查询日
志文件路径
+---------------------------+--------------------------------+
5 rows in set (0.01 sec)
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
#在[mysqld]后面增加
long_query_time = 1 #超过1秒钟的sql记录下来
log-slow-queries = /var/mysql/log/log.txt #慢查询的日志文件
log-queries-no-using-indexes #把没使用索引的查询记录下来
2 使用explain/desc分析sql语句
explain select ... #分析sql语句,sql语句本身并不执行
3 优化sql语句
- 查询的时候不要使用select *
- 尽量使用limit 1 取得唯一的一行
- 尽量使用索引字段进行查询
- 可以使用覆盖索引加速查询 (一个索引包含了查询结果中所有的字段)
- 尽量少用like 或者or
- 不要使用全文索引,如果非要使用可以把全文索引独立出来,建立全文索引服务器
- 关联查询的时候,关联的字段都应该有索引
- 不要使用!=操作,不使用索引
- 查询的时候类型不匹配不使用索引
- 联合索引不带左前缀,不使用索引
- 尽量减少子查询,可以使用关联查询代替子查询
select count(*) from article where uid in(select uid from user
where id=10)
select count(*) from aticle,user where user.id = aticle.uid and
user.id=10
select count(*) from aticle join user on user.id=article.uid
where userid.id=10
- 尽量多试验不同sql语句,比较他们的效率,采用最少
- 不要在where中,运算符左边运算,只要是计算,不采用索引
select username from user where age/2>10
- 不要在where中,运算符左边不要出现任何函数,否则不采用索引
select COUNT(*) from user where year(birthday) == 1993;
- 避免默认排序
select cid,count(*) from bbs group by cid
select cid,count(*) from bbs group by cid order by null #不排序
4 其他优化措施
- 在应用层面可以nosql技术,把数据保存redis、memcached中加速查询
- 从架构层面:读写分离
- 可以使用mysql分区技术,把一个表分为多个文件
- 分库分表分机器
- 把表进行垂直切分,或水平切分
数据库设计 ==》索引 =》SQL语句优化 ===》分区=》nosql缓存 ==》读写分离
=》分库分表分机器(数据库中间件)=》表的垂直/水平切分