数据库mysql语句优化

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语句

  1. 查询的时候不要使用select *
  2. 尽量使用limit 1 取得唯一的一行
  3. 尽量使用索引字段进行查询
  4. 可以使用覆盖索引加速查询 (一个索引包含了查询结果中所有的字段)
  5. 尽量少用like 或者or
  6. 不要使用全文索引,如果非要使用可以把全文索引独立出来,建立全文索引服务器
  7. 关联查询的时候,关联的字段都应该有索引
  8. 不要使用!=操作,不使用索引
  9. 查询的时候类型不匹配不使用索引
  10. 联合索引不带左前缀,不使用索引
  11. 尽量减少子查询,可以使用关联查询代替子查询
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
  1. 尽量多试验不同sql语句,比较他们的效率,采用最少
  2. 不要在where中,运算符左边运算,只要是计算,不采用索引
select username from user where age/2>10
  1. 不要在where中,运算符左边不要出现任何函数,否则不采用索引
 select COUNT(*) from user where year(birthday) == 1993;
  1. 避免默认排序
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缓存 ==》读写分离
=》分库分表分机器(数据库中间件)=》表的垂直/水平切分

发布了44 篇原创文章 · 获赞 0 · 访问量 1226

猜你喜欢

转载自blog.csdn.net/weixin520520/article/details/104516084