SQL语句优化
1)优化SQL语句的一般步骤
1. 查询日志找出耗时高的SQL
2. EXPLAIN查看索引是否生效
3. 查看表索引是否生效
2)索引优化
3)check与optimize使用方法
4)常用SQL的优化
检查服务器增、删、改和查的使用频次:(本次启动以来)
通过show status命令了解各种SQL的执行频率。
格式:mysql>show [session|global] status;
其中:session(默认)表示当前连接,global表示自数据库其中至今
show status like "%Com_update%";
show status like "%Com_insert%";
show status like "%Com_select%";
show status like "%Com_delete%";
查innodb自启动以来的影响行数:
mysql> show status like "%InnoDB_rows%";
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Innodb_rows_deleted | 2 |
| Innodb_rows_inserted | 0 |
| Innodb_rows_read | 105 |
| Innodb_rows_updated | 3 |
+----------------------+-------+
定位执行效率较低的SQL语句:
查看user表索引
索引参考文档:
http://c.biancheng.net/view/7364.html
show index from user\G
让测试数据成倍增长
insert into user(name,age,score,created_at,updated_at) select name,age,score,created_at,updated_at from user;
1.explain(常用)或desc定位一条sql语句的影响行数
前提是已经查询到该sql语句花费了大量的时间,执行效率慢的情况,超过了1ms等等
explain使用查考文档:https://www.jianshu.com/p/18ab39d8dd88
mysql>explain select * from user where username='user8'\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL //
type: ALL //联合查询所使用的类型,type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref >fulltext > ref_or_null > index_merge > unique_subquery >index_subquery > range > index > ALL
possible_keys: NULL //这一列显示了查询可以使用哪些索引,是基于查询访问的列和使用的比较操作符来判断的.(可能用到的索引)
如果没有任何索引可以使用,就会显示成null
key: NULL //显示了MySQL决定采用哪个索引来优化对该表的访问 (真正用到的索引)
key_len: NULL //显示mysql决定使用的键长度,如果键是null,则长度为null。
ref: NULL //显示了之前的表在key列记录的索引中查询值所用到的列或常量
rows: 11 //显示的是MySQL为了找到所需的值而要读取的行数.
filtered: 10.00 //进行全文索引检索。
Extra: Using where
2.查看mysql的慢查询日志.
1)查看慢查询日志是否开启
show variables like "%quer%";
slow_query_log | ON //ON开启慢查询
slow_query_log_file | mysql-slow.log //保存所在日志
long_query_time | 10.000000 //慢查询秒数
2)查看慢查询的次数
show status like "%quer%";
Slow_queries | 0 //慢查询次数
3.修改慢查询的时间(my.ini)
long_query_time=6 //定位为6秒,记录为慢查询sql
4.重启mysql服务器
net stop mysql57
net start mysql57
优化表空间
optimize table sales;也就是把
1.myisam表没有问题.
2.innodb表ibdata1文件无法回收以删除数据表空间.
Mysql联合索引最左匹配原则