MySQL索引创建策略和内部逻辑

时间:2012-05-14 14:38:03

标签: mysql

这个问题需要对MySQL数据库中索引创建的广泛问题做出通用答案。

我们来看这个例子:

CREATE TABLE IF NOT EXISTS `article` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `published` tinyint(1) NOT NULL DEFAULT '0',
  `author_id` int(11) unsigned NOT NULL,
  `modificator_id` int(11) unsigned DEFAULT NULL,
  `category_id` int(11) unsigned DEFAULT NULL,
  `title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  `headline` text COLLATE utf8_unicode_ci NOT NULL,
  `content` text COLLATE utf8_unicode_ci NOT NULL,
  `url_alias` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
  `priority` mediumint(11) unsigned NOT NULL DEFAULT '50',
  `publication_date` datetime NOT NULL,
  `creation_date` datetime NOT NULL,
  `modification_date` datetime NOT NULL,
  PRIMARY KEY (`id`)
);

在这样的示例中,可以对不同的标准执行各种查询:

  • CATEGORY_ID
  • 公布
  • publication_date

e.g:

SELECT id FROM article WHERE NOT published AND category_id = '2' ORDER BY publication_date;

在许多表中,您可以看到各种状态字段(如此处发布的),日期字段或引用字段(如author_id或category_id)。应该选择什么策略来制作索引?

可以在以下几点开发:

  • 为查询中可以使用的每个字段创建一个索引(无论是参数还是排序依据),即使这会导致每个表有很多索引?
  • 同样对只有一小组值的字段(如布尔值或枚举)进行索引,这只会将扫描的范围大小减小一个因子(假设n是输入的数量和均匀使用的每个值)?
  • 我读过5.0之前的MySQL每个请求只使用一个索引,系统如何选择它? (通过选择限制性更强的一个?)
  • 如何处理OR语句?
  • 这会使插入速度减慢多少?
  • InnoDB / MyISAM会改变这个问题吗?

我知道EXPLAIN语句可以用来知道请求是否被优化,但是一些具体的理论内容真的比纯粹的经验方法更具建设性!

0 个答案:

没有答案