我正在研究一个有大量索引的系统.有些索引比其他索引简单.也就是说,它们是INT、VARCHAR、DATETIME,在某些情况下是enum(可能是5~25个变体).

秩序重要吗?换句话说,首先放置更容易搜索的列是否会提高速度/性能?

i、 假设我们有这张桌子,它看起来像这样

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`)

我们希望搜索首先返回最少结果的列,这样下一个条件将有更少的列可供翻转,这样说对吗?

i、 e.这些陈述会给出不同的绩效结果吗?

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

推荐答案

秩序重要吗?换句话说,首先放置更容易搜索的列是否会提高速度/性能?

简短的回答是:没有.

更详细的回答:SQL是一种声明性语言,而不是过程性语言.这是我们大多数开发人员经常使用的唯一声明性语言.服务器软件有查询规划模块,这些模块使用各种方案来找出从每个查询中获得结果集的最可能最有效的方法.即使使用相同的查询和不同的数据,查询计划也可能有所不同.所以我们告诉它what we want,而不是how to get it.

Sometimes it's necessary to adjust indexes or refactor queries to get decent performance. You can read about that in the tag. But the refactoring is never as simple as changing the order of terms in WHERE clauses.

pro tip:很多单列索引很少是个好主意.索引的设计需要与所使用的查询的形状相匹配.阅读马库斯·温兰德的这本Electron 书:https://use-the-index-luke.com

Mysql相关问答推荐

查找关联数据库表的超集

S在我的SQL代码中的外键出了什么问题?

MySQL嵌套的内连接使查询变得很慢-解决方案?

MySQL逻辑全部

MySQL-如何检测时间戳中的一天

为什么 MAX 函数通过调用在 group 中生成正确的结果

获取每个参数的记录,不重复

如何根据 R 中的价格范围将数据从一列复制到新列?

如何在更新表单中使用 group by?在 SQL 中

Mysql Pivot 查询/建议

MySQL Join 查询位置从订单

使用另一个表中的值更新一个表中的值

为什么一个 10 位的电话号码不能存储在长度为 10 的整数中?

在 MySQL 中转换 JSON 数组值

将 Django DB 从 SQLite 迁移到 MySQL 的最佳方法是什么?

mysql错误'TYPE = MyISAM'

在 PHP 中运行 MySQL *.sql 文件

MySQL 错误 2014 的原因在其他无缓冲查询处于活动状态时无法执行查询

MySQL 的最大并发连接数

以二进制形式插入和 Select UUID(16)