我正在开发一个具有大量索引的系统。有些索引比其他索引更简单。即它们是 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`)
Run Code Online (Sandbox Code Playgroud)
我们想要首先搜索返回最少结果的列,这样下一个条件将有更少的列要翻转,这样说是否正确?
即这些语句会产生不同的性能结果吗?
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
Run Code Online (Sandbox Code Playgroud)
WHERE 顺序重要吗?换句话说,首先放置更容易搜索的列会提高速度/性能吗?
简短的回答:不。
更长的答案:SQL 是一种声明性语言,而不是过程性语言。这是我们大多数开发人员经常处理的唯一声明性语言。服务器软件具有查询规划模块,该模块使用各种方案来找出从每个查询获取结果集的最有可能最有效的方法。即使使用相同的查询和不同的数据,查询计划也可能会有所不同。所以我们告诉它我们想要什么,而不是如何得到它。
有时需要调整索引或重构查询以获得良好的性能。您可以在查询优化标签中阅读相关内容。但重构绝不像更改 WHERE 子句中的术语顺序那么简单。
而且,专业提示:大量单列索引很少是一个好主意。索引的设计需要与所使用的查询的形状相匹配。阅读 Marcus Winands 撰写的这本电子书: https: //use-the-index-luke.com