繁体   English   中英

为什么包含“在哪里使用”?

[英]Why does it contain “Using where”?

这是我的表架构。

CREATE TABLE `usr_block_phone` (
    `usr_block_phone_uid` BIGINT (20) UNSIGNED NOT NULL AUTO_INCREMENT,
    `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
    `usr_uid` INT (10) UNSIGNED NOT NULL,
    `block_phone` VARCHAR (20) NOT NULL,
    `status` INT (4) NOT NULL,
    PRIMARY KEY (`usr_block_phone_uid`),
    KEY `block_phone` (`block_phone`),
    KEY `usr_uid_block_phone` (`usr_uid`, `block_phone`) USING BTREE,
    KEY `usr_uid` (`usr_uid`) USING BTREE
) ENGINE = INNODB DEFAULT CHARSET = utf8

这是我的SQL

SELECT
    ubp.usr_block_phone_uid
FROM
    usr_block_phone ubp
WHERE
    ubp.usr_uid = 19
AND ubp.block_phone = '80000000001'

顺便说一句,当我运行“ EXPLAIN”时,得到的结果如下。

+------+-------------+-------+------+-----------------------------------------+---------------------+---------+-------------+------+--------------------------+
| id   | select_type | table | type | possible_keys                           | key                 | key_len | ref         | rows | Extra                    |
+------+-------------+-------+------+-----------------------------------------+---------------------+---------+-------------+------+--------------------------+
|    1 | SIMPLE      | ubp   | ref  | block_phone,usr_uid_block_phone,usr_uid | usr_uid_block_phone | 66      | const,const |    1 | Using where; Using index |
+------+-------------+-------+------+-----------------------------------------+---------------------+---------+-------------+------+--------------------------+

为什么索引usr_uid_block_phone不起作用? 我只想using index

该表现在有20000行。

您的索引已被实际使用,请参见key列。 目前,查询看起来不错,执行计划也不错。

至少要填充一百以供使用(并确保您仍然使用仅过滤一行的谓词)。

还有一个一般性建议:除非您自己是mysql dbms开发人员,否则要预测优化器在特定情况下的行为几乎是不可能的。 因此,总是最好尝试一个尽可能接近生产的数据集(就数据的大小和质量而言)。

WHERE子句中使用的两列( usr_uidblock_phone )都存在于usr_uid_block_phone索引中,这使它成为可能用于处理查询的键。 更重要的是,它是选择索引,但是由于表中的行数较少,MySQL决定不使用索引更快。

原因在于SELECT子句中存在的表达式:

SELECT
    ubp.usr_block_phone_uid

因为所选索引中不存在usr_block_phone_uid列,所以为了处理查询,MySQL需要读取索引(以确定哪些行与WHERE条件匹配) 表数据(获取这些行的usr_block_phone_uid列的值) )。

仅读取表数据并使用WHERE条件查找匹配的行并获取其usr_block_phone_uid列会usr_block_phone_uid 它需要从一个位置读取存储中的数据。 如果使用索引,则需要读取相同的数据索引数据。

当表增长时,情况(以及EXPLAIN的报告)会发生变化。 在某些时候,从索引中读取信息(并使用它来过滤出行)会被大量被过滤掉的行(即,不从存储中读取其数据)所补偿。

发生这种情况的确切时间并不确定。 这取决于表的许多结构以及表中的值如何散布。 即使表很大,MySQL仍可以决定忽略索引,以便从存储介质中读取较少的信息。 例如,如果大部分表行(假设90%)与WHERE条件匹配,则读取所有表数据(忽略索引)比读取90%的表数据和90%的表数据更有效。索引。

上段中90%是我为解释目的而编造的数字。 我不知道MySQL如何决定最好忽略索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM