如何使用WHERE,RANGE和SORT设置MySql表的索引?

时间:2011-01-28 11:46:30

标签: mysql optimization indexing

我有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_dateuseriddate)),我会得到以下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作为键时。你会如何为这样的表和查询设置索引?使用日期类型作为索引是否合适?

1 个答案:

答案 0 :(得分:0)

  

这更好,因为它没有使用filesort

是的,因为在索引中有一个过滤器可用的地方。

您还可以考虑添加已删除的(userid, deleted, date)。但是,请确保在用于范围和order by子句的列之前进行相等比较 - 否则您的排序将会返回。

  

但似乎该类型不如仅使用userid

时那么好

为什么呢?我认为你的指数足够好了。 deleted列可能不值得,也许只是浪费空间。但这取决于其他查询是否也使用该列以及“False”率如何在您的数据库中。