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 //慢查询秒数

unbuntu mysql优化 mysql优化表命令_优化mysql表空间

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联合索引最左匹配原则