有人可以解释为什么如果使用 Limit 优化器会选择不同的索引吗?
玛丽亚数据库>
EXPLAIN SELECT dms_meta.docid
FROM dms_meta
WHERE (dms_meta.metid = 3 and dms_meta.value = '2015-10-01')
ORDER BY dms_meta.docid ASC limit 25;
+------+-------------+----------+-------+---------------+------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+-------+---------------+------------+---------+------+------+-------------+
| 1 | SIMPLE | dms_meta | index | indx_metaid | indx_docid | 8 | NULL | 889 | Using where |
+------+-------------+----------+-------+---------------+------------+---------+------+------+-------------+
一组 1 行(0.001 秒)
玛丽亚数据库>
EXPLAIN SELECT dms_meta.docid
FROM dms_meta
WHERE (dms_meta.metid = 3 and dms_meta.value = '2015-10-01')
ORDER BY dms_meta.docid ASC;
+------+-------------+----------+------+---------------+-------------+---------+-------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+----------+------+---------------+-------------+---------+-------+--------+-----------------------------+
| 1 | SIMPLE | dms_meta | ref | indx_metaid | indx_metaid | 4 | const | 121880 | Using where; Using filesort |
+------+-------------+----------+------+---------------+-------------+---------+-------+--------+-----------------------------+
一组 1 行(0.000 秒)
第一个查询在 0.5 秒内完成,而第二个查询则需要 6 秒以上。我在用 mysql 版本 15.1 分发 10.11.4-MariaDB
奇怪的是,在 MySql 5.0.95 上,两个查询都选择相同的索引并在不到一秒的时间内完成。
有什么建议吗?
在 select 中使用 Limit 选择不同的索引会对性能产生巨大影响,但我需要引擎每次都做出正确的选择
不,我无法完全解释这个选择。但这里有些挥手。收集有关可能索引中提到的列的选择性的统计数据,并选择“最佳”一列。当查询实际运行时,它可能不是最好的。
您的查询将运行得更快
INDEX(metid, value, docid)
如果
value
是TEXT
,那么呃!这听起来像一个实体-属性-值模式,它存在各种各样的问题。为此,我推荐以下内容:Entity-Attribute-Value,这是一个有助于 WordPress 的插件:WP Index Improvements