议程表的Mysql最佳索引

时间:2017-04-25 13:51:39

标签: mysql optimization indexing agenda

CREATE TABLE IF NOT EXISTS `agenda` (
  `id_agenda` int(11) NOT NULL AUTO_INCREMENT,
  `id_user` int(11) NOT NULL DEFAULT '0',
  `id_customer` int(11) DEFAULT NULL,
  `type` int(11) NOT NULL DEFAULT '8',
  `title` varchar(255) NOT NULL DEFAULT '',
  `text` text NOT NULL,
  `start_day` date NOT NULL DEFAULT '0000-00-00',
  `end_day` date NOT NULL DEFAULT '0000-00-00',
  `start_hour` time NOT NULL DEFAULT '00:00:00',
  `end_hour` time NOT NULL DEFAULT '00:00:00'
  PRIMARY KEY (`id_agenda`),
  KEY `start_day` (`start_day`),
  KEY `id_customer` (`id_customer`),
  KEY `id_user` (`id_user`),
  KEY `type` (`type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;

让我们遇到这种情况:一个包含200万条记录的议程表的软件,10个活跃用户。

支持此类需求的最佳索引配置是什么:

1)用户的所有约会列表。

示例:

SELECT * from agenda where id_user = '1';

2)当天,周或月的所有约会清单。

示例:

SELECT * from agenda where start_day = CURDATE();

3)链接到客户X的所有约会的列表。

示例:

SELECT * from agenda where id_customer = 'X';

4)例如,一个月中Y类型的所有约会的列表。

示例:

SELECT * from agenda where type='2' AND MONTH(start_day) = MONTH(CURDATE());

5)标题中包含一些字符串模式的所有约会的列表。

示例:

SELECT * from agenda where title LIKE '% closing %';

我问这个因为我在很多文档中读到了为WHERE子句,ORDER BY,GROUP BY中使用的每个字段都有一个索引的错误选择......但是对于这种需求如何可以避免每个字段的索引? 使用复合索引,如果我做对了,我可以使用第二个字段,就好像我使用索引的第一个字段,这是正确的吗?

感谢所有人。

1 个答案:

答案 0 :(得分:1)

SELECT * from agenda where id_user = '1';
INDEX(id_user)

SELECT * from agenda where start_day = CURDATE();
INDEX(start_day)

SELECT * from agenda where id_customer = 'X';
INDEX(id_customer)

这一个

SELECT  *
    from  agenda
    where  type='2'
      AND  MONTH(start_day) = MONTH(CURDATE());

不是一个好的表述。改为

SELECT  *
    from  agenda
    where  type='2'
      AND  start_day >= CONCAT(LEFT(CURDATE(), 7), '-01')
      AND  start_day  < CONCAT(LEFT(CURDATE(), 7), '-01') + INTERVAL 1 MONTH;

并添加此复合索引:INDEX(type, start_day)。同时摆脱type上的索引;它将毫无用处。

这个不能按原样优化(因为前导通配符):

SELECT  *
    from  agenda
    where  title LIKE '% closing %';

FULLTEXT(title)索引与MATCH(title) AGAINST('+closing' IN BOOLEAN MODE)一起会很快。

关于构建索引的

More