使用 explain 查看 select 语句的执行计划
2.1.9.1 用查询语句查看是否使用索引情况
mysql> explain select * from test where name=‘oldgirl’\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
type: ALL
possible_keys: NULL 从查看的结果看出,查询的时候没有走索引
key: NULL
key_len: NULL
ref: NULL
rows: 4 总结查询了 4 行
Extra: Using where
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> show create table test;
±------±-----------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------+
| Table | Create Table
|
±------±-----------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------+
| test | CREATE TABLE test (
id int(4) NOT NULL DEFAULT ‘0’,
age tinyint(2) DEFAULT NULL,
name varchar(16) DEFAULT NULL,
shouji char(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
±------±-----------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2.1.9.2 为该列创建索引,再用查询语句查看是否走了索引
mysql> alter table test add index index_name (name);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> explain select * from test where name=‘oldgirl’\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: test
type: ref
possible_keys: index_name 从下面结果看出语句查询的时候走了索引
key: index_name
key_len: 51
ref: const
rows: 1 总共查询了 1 行,效率更快
Extra: Using where
1 row in set (0.00 sec)
ERROR:
No query specified
2.2.0 使用 explain 优化 SQL 语句(select 语句)的基本流程
2.2.1 用命令抓取慢 SQL 语句,然后用 explain 命令查看查询语句是否走的索引查询
1 在数据库命令行里面操作
mysql> show full processlist;
±—±-----±----------±-------±--------±-----±------±----------------------+
| Id | User | Host | db | Command | Time | State | Info
±—±-----±----------±-------±--------±-----±------±----------------------+
| 13 | root | localhost | oldboy | Query | 0 | NULL | show full processlist |
±—±-----±----------±-------±--------±-----±------±----------------------+
1 row in set (0.00 sec)
2 在 linux 命令行操作
[root@mysql 3306]# mysql -u root -ppcwangjixuan -S /mysqldata/3306/mysql.sock -e “show full
processlist”|grep -vi “sleep”
Id UserHostdb Command Time StateInfo
15 root localhost NULL Query 0 NULL show full processlist
2.2.2 设置配置参数记录慢查询语句
log_query_time = 2 <==查询时间超过 2 秒,记录到 log 里
log_queries_not_using_indexs <==没有走索引的语句,记录到 log 里
log-slow-queries = /data/3306/slow.log
2.2.3 对抓取到的慢查询语句用 explain 命令检查索引执行情况
例如:
explain select * from test where name=’oldboy’\G;
2.2.4 对需要建索引的条件列建立索引
大表不能高峰值建立索引,300 万记录
2.2.5 切割慢查询日志,去重分析后发给大家
关于 mysql 的配置文件参数设置(my.cnf)
[mysqld]
long_query_time = 1
log-slow-queries = /data/3306/slow.log
log_queries_not_using_indexs
关于日志切割脚本
mv /data/3306/slow.log /opt/$(date +%F)_slow.log
mysqladmin –uroot –ppcwangjixuan –S /data/3306/mysql.sock flush-logs




