1.explain
id | select_type | talbe | partions | type | possible_keys | key | key_len | ref | rows | filtered | extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 1.全表扫描ALL 2.范围扫描 3.唯一索引查询 4.常数引用 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
一般MySQL能够使用如下三种方式应用where条件,从好到坏依次为:
- 在索引中使用where条件来过滤不匹配的记录。这里在存储引擎层完成的。
- 使用索引覆盖扫描(在Extra列中出现了)来返回记录,直接从索引中过滤不需要的记录并返回命中的结果。这是在服务器层完成的,但无须再回表查询记录。
- 从数据表中返回数据,然后过滤不满足条件的记录(在Extra列中出现)。这是在服务器层完成,需要先从数据表读出记录然后过滤。
2.查询状态(show full processlist)
- sleep 线程正在等待客户端发送新的请求。
- query 线程正在执行查询或者正在将结果发送给客户端。
- locked 在mysql服务器层,该线程正在等待表锁。在存储引擎级别实现的锁,例如InnoDB的行锁,并不会体现在线程状态中。对MyISAM来说这是一个比较典型的状态,但在其他没有行锁的引擎中也经常会出现。
- Analyzing and statistics 线程正在收集存储引擎的统计信息,并生成查询的执行计划。
- copying to tmp table [on disk] 线程正在执行查询,并且将其结果集都复制到一个临时表中,这种状态一般要么是在做Group by操作,要么是文件排序操作,或者是union操作。如果这个状态后面还有“on disk”标记,那表示mysql正在将一个内存临时表放到磁盘上。
- Sorting result 线程正在对结果集进行排序。
- Sending data 这表示多种情况:线程可能在多个状态之间传递数据,或者在生成结果集,或者在向客户端返回数据。