这个问题期望对 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 语句可用于了解请求是否已优化,但一些具体的理论内容确实比纯粹的经验方法更具建设性!