我有MySql表和查询,我正在尝试优化并提出一些问题。
SELECT value FROM table WHERE userid=?userid AND date <= ?date AND deleted='False' ORDER BY date DESC LIMIT 1
表格:
CREATE TABLE `table` (
`tableid` int(11) NOT NULL AUTO_INCREMENT,
`userid` int(11) DEFAULT NULL,
`value` double DEFAULT '0',
`date` date DEFAULT NULL,
`deleted` enum('False','True') DEFAULT 'False',
PRIMARY KEY (`tableid`),
KEY `userid_date` (`userid`)
) ENGINE=InnoDB;
我为查询得到以下EXPLAIN结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table ref userid_date userid_date 5 const 4 Using where; Using filesort
如果我更改为使用userid_date键中的日期(KEY userid_date
(userid
,date
)),我会得到以下EXPLAIN结果:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE table range userid_date userid_date 9 NULL 4 Using where
这更好,因为它没有使用filesort,但似乎类型不如仅使用userid作为键时。你会如何为这样的表和查询设置索引?使用日期类型作为索引是否合适?
答案 0 :(得分:0)
这更好,因为它没有使用filesort
是的,因为在索引中有一个过滤器可用的地方。
您还可以考虑添加已删除的(userid, deleted, date)
。但是,请确保在用于范围和order by子句的列之前进行相等比较 - 否则您的排序将会返回。
但似乎该类型不如仅使用userid
时那么好
为什么呢?我认为你的指数足够好了。 deleted
列可能不值得,也许只是浪费空间。但这取决于其他查询是否也使用该列以及“False”率如何在您的数据库中。