1. 查看库的各链接状态
对于一个mysql连接或者一个线程,任何时刻都有一个状态,表示其当前正在做什么。一般使用show full processlist查看。+---------+-------------+-------------------+------+---------+------+-------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+-------------+-------------------+------+---------+------+-------+-----------------------+
| 2547225 | operator@RR | 10.3.18.205:60253 | fb | Query | 0 | NULL | show full processlist |
| 2548100 | operator@RR | 10.4.19.83:51754 | fb | Sleep | 1 | | NULL |
| 2548101 | operator@RR | 10.4.19.83:53661 | fb | Sleep | 1 | | NULL |
| 2548102 | operator@RR | 10.4.19.83:45808 | fb | Sleep | 1 | | NULL |
| 2548103 | operator@RR | 10.4.19.83:58881 | fb | Sleep | 1 | | NULL |
| 2548104 | operator@RR | 10.4.19.83:33521 | fb | Sleep | 1 | | NULL |
+---------+-------------+-------------------+------+---------+------+-------+-----------------------+
2. 查看表状态
数据库各表的信息都保存在INFORMATION_SCHEMA-->TABLES表里。可以直接在此表查询也可以通过SHOW TABLE STATUS命令来查询。
SHOW TABLE STATUS LIKE 'user' WHERE id = 1 \G;
结果:
*************************** 1. row ***************************
Name: user(表名)
Engine: InnoDB(存储引擎)
Version: 10
Row_format: Compact(行的格式,是否固定或压缩)
Rows: 4(行数,对于MyISAM该值是精确的,但对于InnoDB该值是估计值)
Avg_row_length: 4096(平均每行的字节数)
Data_length: 16384(表数据总的字节数)
Max_data_length: 0(表数据的最大容量,和存储引擎有关)
Index_length: 0(索引的大小B)
Data_free: 7340032(对于MyISAM表示已分配但没有使用的空间)
Auto_increment: 5(下一个AUTO_INCREMENT值)
Create_time: 2014-06-17 16:45:53(表的创建时间)
Update_time: NULL(表数据的最后修改时间)
Check_time: NULL(使用CHECK TABLE或myisamchk检查表的时间)
Collation: utf8_bin(表的默认字符集和字符列排序规则)
Checksum: NULL(整个表的实时检验和)
Create_options: (创建表时指定的其他选项)
Comment:
1 row in set (0.00 sec)
3. 查看SQL语句执行情况
EXPLAIN sql...explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。
EXPLAIN SELECT id FROM user WHERE id=1 \G;
结果:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
type: const
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: const
rows: 1
Extra: Using index
1 row in set (0.02 sec)
列名 | 类型 | 解释 |
---|---|---|
id | SELECT语句的ID编号,优先执行编号较大的查询,如果编号相同,则从上向下执行 | |
select_type | SIMPLE | 一条没有UNION或子查询部分的SELECT语句 |
PIMARY | 最外层或最左侧的SELECT语句 | |
UNION | UNION语句里的第二条或最后一条SELECT语句 | |
DEPENDENT UNION | 和UNION类型的含义相似,但需要依赖于某个外层查询 | |
UNION RESULT | 一条UNION语句的结果 | |
SUBQUERY | 子查询中的第一个SELECT子句 | |
DEPENDENT SUBQUERY | 和SUBQUERY类型的含义相似,但需要依赖于某个外层查询 | |
DERIVED | FROM子句里的子查询 | |
table | t1 | 各输出行里的信息是关于哪个数据表的 |
Partitions | NULL | 将要使用的分区.只有EXPLAIN PARTITIONS ...语句才会显示这一列.非分区表显示为NULL |
type | 联接操作的类型,性能由好到差依次如下 | |
system | 表中仅有一行 | |
const | 单表中最多有一个匹配行 | |
eq_ref | 联接查询中,对于前表的每一行,在此表中只查询一条记录,使用了PRIMARY或UNIQUE | |
ref | 联接查询中,对于前表的每一行,在此表中只查询一条记录,使用了INDEX | |
ref_or_null | 联接查询中,对于前表的每一行,在此表中只查询一条记录,使用了INDEX,但是条件中有NULL值查询 | |
index_merge | 多个索引合并 | |
unique_subquery | 举例说明: value IN (SELECT primary_key FROM single_table WHERE some_expr) | |
index_subquery | 举例说明: value IN (SELECT key_column FROM single_table WHERE some_expr) | |
range | 只检索给定范围的行,包括如下操作符: =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, or IN() | |
index | 扫描索引树(略比ALL快,因为索引文件通常比数据文件小) | |
ALL | 前表的每一行数据都要跟此表匹配,全表扫描 | |
possible_keys | NULL | MySQL认为在可能会用到的索引.NULL表示没有找到索引 |
key | NULL | 检索时,实际用到的索引名称.如果用了index_merge联接类型,此时会列出多个索引名称,NULL表示没有找到索引 |
key_len | NULL | 实际使用的索引的长度.如果是复合索引,那么只显示使用的最左前缀的大小 |
ref | NULL | MySQL用来与索引值比较的值, 如果是单词const或者???,则表示比较对象是一个常数.如果是某个数据列的名称,则表示比较操作是逐个数据列进行的.NULL表示没有使用索引 |
rows | MySQL为完成查询而需要在数据表里检查的行数的估算值.这个输出列里所有的值的乘积就是必须检查的数据行的各种可能组合的估算值 | |
Extra | Using filesort | 需要将索引值写到文件中并且排序,这样按顺序检索相关数据行 |
Using index | MySQL可以不必检查数据文件, 只使用索引信息就能检索数据表信息 | |
Using temporary | 在使用 GROUP BY 或 ORDER BY 时,需要创建临时表,保存中间结果集 | |
Using where | 利用SELECT语句中的WHERE子句里的条件进行检索操作 |