我正在处理一个有很多索引的系统。一些索引比其他索引更简单,比如INT、VARCHAR、DATETIME以及在某些情况下ENUMS(可能有5~25个变化)。
WHERE条件的顺序是否重要?换句话说,将更容易搜索的列放在前面是否会增加速度/性能?
例如,我们有这样一张表:
CREATE TABLE IF NOT EXISTS `example_table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_id` int(11) unsigned NOT NULL, -- 1 ~ 4,294,967,295 (non unique)
`type_id` int(11) unsigned NOT NULL, -- (Enum with 15 values)
`name` VARCHAR(255) NOT NULL, -- alphanumeric
`boolean_value` tinyInt(1) DEFAULT 0, -- only 0 or 1
`created_date` DATETIME NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE INDEX `example_table_user_id_index` ON `example_table` (`user_id`);
CREATE INDEX `example_table_type_id_index` ON `example_table` (`type_id`);
CREATE INDEX `example_table_name_index` ON `example_table` (`name`);
CREATE INDEX `example_table_boolean_value_index` ON `example_table` (`boolean_value`);
CREATE INDEX `example_table_created_date_index` ON `example_table` (`created_date`)
我们要搜索返回最少结果的列,这样下一个条件需要查找的列就会更少,这种说法正确吗?
例如,以下语句是否会产生不同的性能结果?
1. SELECT id FROM example_table WHERE boolean_value = ? AND user_id = ? AND type_id = ? LIMIT 1000
2. SELECT id FROM example_table WHERE type_id = ? AND user_id = ? AND boolean_value = ? LIMIT 1000
3. SELECT id FROM example_table WHERE user_id = ? AND type_id = ? AND boolean_value = ? LIMIT 1000
INDEX(a, b, c)
)将有助于大多数涉及a、b、c或a、b或a的WHERE子句。但对于其他任何组合都没有那么有用。请参阅我的Index Cookbook。 - Rick JamesPRIMARY KEY
列的B+树。这样,它可以通过主键进行第二次查找以获取其余的列。 - Rick James