【发布时间】:2013-09-02 15:16:16
【问题描述】:
我有一个需要优化的复杂查询表, 我阅读了大多数关于 MySQL 索引的文档.. 但在这种情况下我不确定 怎么办:
数据结构:
-- please, don't comment on the field types and names, it is outsourced project.
CREATE TABLE items(
record_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
solid CHAR(1) NOT NULL, -- only 'Y','N' values
optional CHAR(1) NULL, -- only 'Y','N', NULL values
data TEXT
);
查询:
SELECT * FROM items
WHERE record_id != 88
AND solid = 'Y'
AND optional !='N' -- 'Y' OR NULL
当然还有额外的连接和相关数据,但这是最大的过滤器。
在以下场景中:
- 200 000 多条记录,
- 10%(全部)solid = 'Y',
- 10%(来自全部)optional!='N',
什么是这个查询的好索引?
或更准确地说:
第一个检查记录 != 88 是否会以任何方式减慢查询速度?
(它只消除一个结果...?)哪个更快 (
optional!='N') 或 ('optional' = 'Y' OR 'optional' iS NULL)
如上所述optional= 'N' 占总数的 10%。对只有 2 个可能值的 CHAR(1) 列进行索引有什么特别之处吗?
我可以使用这个索引(record_id、solid、optional)吗?
我可以为特定值创建索引吗(solid = 'Y', optional !='N')?
根据@Jack 的要求,当前的 EXPLAIN 结果(总共 30 000 行,有 20 个结果):
【问题讨论】:
-
仅供参考,
optional != 'N'与'Y' OR NULL不同。NULL很特殊,=和!=测试都失败了。 -
EXPLAIN SELECT ...说什么?那将是第一个检查。 -
@Jack 不是真的,因为我现在有小数据集,而且只有 PK 索引。
-
您可以模拟更大的数据集,不是吗? :)
标签: mysql