Mysql 的执行计划中有项不起眼但同时很让人产生误解的东西,其中有一项就是Extra, 这一列放在了最后,并且意思是额外的辅助信息,似乎是最不起眼的一个项。
id |
select_id |
The SELECT identifier |
select_type |
None | The SELECT type |
table |
table_name |
The table for the output row |
partitions |
partitions |
The matching partitions |
type |
access_type |
The join type |
possible_keys |
possible_keys |
The possible indexes to choose |
key |
key |
The index actually chosen |
key_len |
key_length |
The length of the chosen key |
ref |
ref |
The columns compared to the index |
rows |
rows |
Estimate of rows to be examined |
filtered |
filtered |
Percentage of rows filtered by table condition |
Extra |
None | Additional information |
Extra会有哪些值呢? 官方列出了20多种,我一一看了下,大部分都是特别好懂,有兴趣可以点击上面链接去官网查看,我不在一一详列。 其中最常见的莫过于以下几种了。
Using index
(JSON: using_index
)
The column information is retrieved from the table using only information in the index tree without having to do an additional seek to read the actual row. This strategy can be used when the query uses only columns that are part of a single index. (这个用一句话解释,就是覆盖索引,不需要读取数据文件)
例如:
语句1:select id from T where id =1;(id 为primary key)
可是如果将查询改为:
alter table T add index idx_name('name');
语句2: select name from t where name='test';
Extra就会变为 Using where; Using index
为什么呢?很明显语句2也是走索引查询,也是覆盖索引。我们来看看官方的E文
Using where
(JSON: attached_condition
text)
A WHERE
clause is used to restrict which rows to match against the next table or send to the client. Unless you specifically intend to fetch or examine all rows from the table, you may have something wrong in your query if the Extra
value is not Using where
and the table join type is ALL
or index
.
join type 是 ALL 或者 index都是走全表扫描,只是一个扫表,一个扫索引。 那么Using where 的意思在这里似乎也解释的很明朗,那就是用来过滤的。 可是为什么语句1 没有用Using where呢? 其实我认为这只是一个理解的问题。 并不代表语句一没有用where去过滤定位, 而是唯一索引可以一次性定位出固定的值,而非唯一索引只能找到索引的页码,具体的值还得根据Where条件继续去遍历索引。
File sort: 并不代表文件排序
这两个定义确实很容易给人造成误解,所以我的建议是不要在这两个信息里面做过多的想像。前面的项目信息更有参考价值。
相关推荐
表名1 INNER JOIN 表名2 USING (列名) [WHERE 条件表达式] 外连接语法格式如下: 表名1 LEFT| RIGHT JOIN 表名2 USING (列名) [WHERE 条件表达式] ; 【例】 查找Members表中所有订购过图书的会员的姓名。 SELECT ...
Using Where 是 Extra 列中的一种状态,意味着 MySQL 使用了 where 条件来过滤数据。这种情况下,MySQL 会使用索引或表扫描来实现 where 条件的过滤。Using Where 通常出现在查询条件中包含索引前导列时。 例如,在...
然而,在某些情况下,MySQL可能会使用`Using filesort`来完成这些操作,这通常会导致性能下降。本文将深入探讨`Using filesort`的原理及其在`ORDER BY`和`GROUP BY`中的应用。 1. **SQL执行顺序** 在一个SQL查询中...
Using connection As New MySqlConnection(connectionString) Using command As New MySqlCommand(query, connection) connection.Open() command.ExecuteNonQuery() End Using End Using End Sub ``` 2. **...
在MySQL数据库中,`USING` 是一个在执行JOIN操作时非常有用的子句,它用于指定连接两个或多个表的共同列。当我们需要基于共享的列来联接两个表时,`USING` 提供了一个简洁且易于理解的方法。本文将深入探讨 `USING` ...
在安装MySQL之后,可能会遇到无法连接的问题,其中一种常见的错误提示是“Error 1045 Access denied for user 'root'@'localhost' (using password: YES)”。这个问题通常出现在尝试使用root用户登录MySQL服务器时...
const char *delete_query = "DELETE FROM table_name WHERE condition"; if (mysql_query(conn, delete_query)) { // 错误处理 } ``` 在完成所有操作后,别忘了关闭数据库连接,以释放资源: ```c mysql_close...
### MySQL三种关联查询的方式:ON vs USING vs 传统风格 在数据库操作中,关联查询是极为常见的一种需求,尤其在关系型数据库如MySQL中更是如此。本文将详细探讨三种常用的关联查询方式:传统风格(也被称为Theta...
* Using index:当查询使用了索引时,将会提示该额外信息。 * Using temporary:当查询使用了临时表时,将会提示该额外信息。 * Using filesort:当查询使用了文件排序时,将会提示该额外信息。 了解 Explain 语句...
For help with using MySQL, please visit either the MySQL Forums or MySQL Mailing Lists, where you can discuss your issues with other MySQL users. Document generated on: 2018-05-11 (revision: 57346)
using MySql.Data.MySqlClient; using System; using System.Data; ``` 要建立数据库连接,需要创建一个`MySqlConnection`对象,并提供包含数据库连接信息的连接字符串。连接字符串通常包括服务器地址(IP或域名)...
文件`How to Add-Update-Delete-Record using MySQL.jpg`可能是展示如何使用图形用户界面(GUI)工具进行这些操作的截图。许多工具如phpMyAdmin、MySQL Workbench等提供了更直观的方式来管理数据库,对于初学者尤其...
mysql> UPDATE user SET Password=PASSWORD('newpassword') where USER='root'; mysql> FLUSH PRIVILEGES; mysql> \q ``` 二、在创建数据库时报错 在创建数据库时,可能会遇到以下错误: ``` mysql> create ...
using (var command = new MySqlCommand(createDatabaseQuery, connection)) { command.ExecuteNonQuery(); } } ``` 创建数据表后,我们可以定义表结构,如字段名、数据类型、主键等。例如,创建一个名为`users...
UPDATE mysql.user SET Password = PASSWORD('new_password') WHERE User = 'root'; FLUSH PRIVILEGES; EXIT; ``` 3. **正常启动MySQL服务**: - 密码重置完成后,可以使用正常方式重新启动MySQL服务: ```...
using (var command = new MySqlCommand($"SELECT ImageData, ContentType FROM Images WHERE ID = {imageId}", connection)) { // 执行查询 using (var reader = command.ExecuteReader()) { if (reader.Read()...
- 如果尝试使用 root 用户登录 MySQL 时报错(例如 `ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)`),则需要重置 root 用户密码: 1. 停止 MySQL 服务:`...
当我们看到`EXPLAIN`输出中的`Using filesort`,这意味着MySQL无法利用索引来对查询结果进行排序,而必须采用一种更耗时的全内存排序方法。这通常发生在`ORDER BY`子句中涉及的列没有合适索引或者`GROUP BY`操作无法...