1

这个问题期望对 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`)
);

在这样的示例中,可以根据不同的标准执行广泛的查询:

  • 类别ID
  • 发表
  • 发布日期

例如:

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

在许多表格中,您可以看到范围广泛的状态字段(如在这里发布)、日期字段或参考字段(如 author_id 或 category_id)。应该选择什么策略来制作索引?

可以根据以下几点进行开发:

  • 对可以在查询中使用的每个字段(作为 where 参数或 order by)创建索引,即使这会导致每个表有很多索引?
  • 还要在只有一小组值(如布尔值或枚举)的字段上创建索引,这只会将扫描的范围大小减少一个因子(假设 n 是输入的数量并且每个值都是均匀使用的)?
  • 我读过 MySQL 5.0 之前的每个请求只使用一个索引,系统如何选择它?(通过选择更严格的一个?)
  • 如何处理 OR 语句?
  • 这会减慢插入多少?
  • InnoDB/MyISAM 对这个问题有什么改变吗?

我知道 EXPLAIN 语句可用于了解请求是否已优化,但一些具体的理论内容确实比纯粹的经验方法更具建设性!

4

0 回答 0