3
mysql> desc ads_common;
+--------------+-----------+------+--- --+--------------------------------+----------------+
| 领域 | 类型 | 空 | 钥匙 | 默认 | 额外 |
+--------------+-----------+------+--- --+--------------------------------+----------------+
| ads_id | bigint(20) 无符号 | 否 | 优先级 | 空 | 自动增量 |
| 用户 ID | bigint(20) 无符号 | 否 | 穆尔 | 空 | |
| 网站类型 | 枚举('组','用户') | 否 | 穆尔 | 空 | |
| 网站ID | bigint(20) 无符号 | 否 | | 空 | |
| subgroup_id | bigint(20) 无符号 | 否 | | 空 | |
| country_id | smallint(5) 无符号 | 否 | 穆尔 | 空 | |
| type_id | int(10) 无符号 | 否 | 穆尔 | 空 | |
| 电话 | 整数(11) | 否 | | 空 | |
| 手机| int(10) 无符号 | 否 | | 空 | |
| cat_id | int(10) 无符号 | 否 | 穆尔 | 空 | |
| 品牌标识 | mediumint(8) 无符号 | 否 | 穆尔 | 空 | |
| 型号ID | mediumint(8) 无符号 | 否 | 穆尔 | 空 | |
| area_id | int(10) 无符号 | 否 | 穆尔 | 空 | |
| is_offering | 小整数(1) | 否 | 穆尔 | 1 | |
| 价格 | 整数(11) | 否 | 穆尔 | 空 | |
| 项目状态 | tinyint(3) 无符号 | 否 | 穆尔 | 空 | |
| 添加时间 | 时间戳 | 否 | 穆尔 | CURRENT_TIMESTAMP | |
| 问题编号 | smallint(5) 无符号 | 否 | | 空 | |
| is_stop | 小整数(1) | 否 | 穆尔 | 0 | |
+--------------+-----------+------+--- --+--------------------------------+----------------+

我确实有 type_id、country_id、is_top 多列索引和 type_id 单索引。ads_common 表大约有 180245 行。

1.先查询命令

SELECT c.ads_id FROM ads_common AS c                                
WHERE c.type_id IN (185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241) 
AND c.country_id=226 AND is_stop=0  ORDER BY c.ads_id DESC

找到 180,047 行,耗时 0.0026 秒

2.秒查询命令

SELECT c.ads_id FROM ads_common AS c
WHERE c.type_id=187 
AND c.country_id =226 AND is_stop=0 ORDER BY c.ads_id DESC

找到 180,044 行,耗时 0.2335 秒

只有两个不同的命令是“type_id IN (..187..)”和“type_id=187”,为什么命令2比1慢?

如果命令 2 更改为:

SELECT c.ads_id FROM ads_common AS c
WHERE c.type_id IN (185, 187)
AND c.country_id =226 AND is_stop =0 ORDER BY c.ads_id DESC

找到 180,044 行,这需要 0.0007 秒,这更快。

SELECT c.ads_id FROM ads_common AS c
WHERE c.type_id IN (187)
AND c.country_id =226 AND is_stop =0 ORDER BY c.ads_id DESC

找到 180,044 行,这需要 0.2267 秒,这更快。

所有命令都返回几乎相同的行。

4

1 回答 1

0

1.命令

SELECT c.ads_id
FROM ads_common AS c                                
WHERE c.type_id=187
AND c.country_id=226 AND is_stop=0  ORDER BY c.ads_id DESC

(总共 180,044,查询耗时 0.2364 秒)

    解释

    编号:1
    选择类型:简单
    表:c
    类型:index_merge
    可能的键:type_id、country_id、is_stop
    键:is_stop,country_id,type_id
    key_len:1,2,4
    参考:空
    行数:22530  
    额外:使用 intersect(is_stop,country_id,type_id); 使用...

2.命令

SELECT c.ads_id
FROM ads_common AS c                                
WHERE c.type_id IN (0,187)
AND c.country_id=226 AND is_stop=0  ORDER BY c.ads_id DESC

总共 180,044 个,查询耗时 0.0010 秒

    解释

    编号:1
    选择类型:简单
    表:c
    类型:参考
    可能的键:type_id、country_id、is_stop
    键:country_id
    key_len:2
    参考:常量
    行数:90122
    额外:使用 where

非常有趣,几乎相同的命令,但获得不同的性能。

最后,我重新启动mysql并执行命令,每次执行命令前都重新启动,所以缓存没有问题。

命令 1 耗时 1.2358 秒“c.type_id=187”
命令 2 耗时 0.05 秒 "c.type_id IN (0, 187)",您可以将 0 替换为任意数字,结果相同。

是的,“c.type_id in (187)”与“c.type_id=187”的性能相同,但“c.type_id in (187,0)”或“c.type_id in (0,187)”性能更好。

于 2013-04-02T07:27:36.157 回答