我在2台服务器上拥有相同的数据库。一个是Cpanel运行mysql,另外一个是CWP和mariadb。两个数据库都是相同的,表具有相同的索引,mysql变量是相同的但性能不同:
SELECT
DISTINCT item_id
FROM
site_plugin_products_cache_filters
WHERE
value_id IN (32)
在MySql上我得到1,939行(1.284秒) 在MaridDb上我得到1,937行(0.097秒)
知道为什么会这样吗?
当我进行子查询时,差异会更大(0.01秒对100秒)
SELECT
DISTINCT item_id
FROM
site_plugin_products_cache_filters
WHERE
value_id IN (32) AND
item_id IN (
SELECT item_id FROM
site_plugin_products_cache_cats
WHERE
cat_id=1
)
或者
SELECT DISTINCT item_id FROM site_plugin_products_cache_cats
WHERE cat_id IN (362) AND item_id != 2519 ORDER BY rand()
LIMIT 4
4行(0.053 s)vs 4行(0.103 s)
答案 0 :(得分:0)
似乎WHM / CPanel默认带有query_cache_size = 0,这就是杀死性能。设置为最佳值后,其正常情况:)
答案 1 :(得分:0)
不,将query_cache_size
设置为非零值会隐藏实际执行时间。当任何写入表时,将清除QC中的所有条目。突然,查询采用" long"时间而不是任意短暂的时间。
0.01s闻起来像QC时间。 0.097s没有。
您的第一个查询可能会受益于复合INDEX(value_id, item_id)
。
site_plugin_products_cache_cats
可能会受益于INDEX(cat_id, item_id)
。
MySQL和MariaDB之间存在性能差异的一个非常有效的原因 - 优化器有所不同,特别是在子查询领域。 IN ( SELECT ... )
以前的表现非常糟糕。现在两种产品都以不同的方式进行了改进。
为了比较真实的性能,一种技术是SELECT SQL_NO_CACHE ...
并运行查询两次。拿秒时间。 (第一个可能是在进行I / O以填充其他缓存。)