我有一个包含复杂查询的表,我正在寻找优化,我阅读了大多数关于 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 ) = 'N' 占总数的 10%。optional
对只有 2 个可能值的 CHAR(1) 列进行索引有什么特别之处吗?
我可以使用这个索引(record_id、solid、optional)吗?
我可以为特定值创建索引(实心 = 'Y',可选!='N')吗?
根据@Jack 的要求,当前的EXPLAIN结果(总共 30 000 行,有 20 个结果):
+-------------+--------+--------------+---------+-- --------+------+--------+-----------+ | 选择类型 | 类型 | 可能键 | 关键 | key_len | 参考 | 行 | 额外 | +-------------+--------+--------------+---------+-- --------+------+--------+-----------+ | 初级 | 范围 | 初级 | 初级 | 4 | 空 | 16228 | 使用位置 | +-------------+--------+--------------+---------+-- --------+------+--------+-----------+