【发布时间】:2010-10-18 01:02:54
【问题描述】:
由于在我的 SQL 代码中使用“ORDER BY”语句,我遇到了一些相当严重的性能问题。
只要我不在 SQL 中使用 ORDER BY 语句,一切都很好。但是,一旦我在 SQL 代码中引入 ORDER BY:s,由于缺乏正确的索引,一切都会大大减慢。有人会认为解决这个问题是微不足道的,但从论坛讨论等情况来看,这似乎是一个相当普遍的问题,我还没有看到这个问题的明确和简洁的答案。
问题:给定下表...
创建表 values_table ( id int(11) NOT NULL auto_increment, ... value1 int(10) unsigned NOT NULL default '0', value2 int(11) NOT NULL 默认 '0', 主键(id), 键值1(值1), 键值2(值2), ) 引擎=MyISAM AUTO_INCREMENT=2364641 默认字符集=utf8;...如何创建索引,以便在查询表以获取 value1 范围同时对 value2 的值进行排序时使用?
目前,当不使用 ORDER BY 子句时,获取是可以的。
查看以下 EXPLAIN QUERY 输出:
好的,当不使用 ORDER BY 时: 解释 select ... from values_table this_ where this_.value1 介于 12345678 和 12349999 之间,限制为 10; +----+-------------+--------+-------+-------------- -+----------+---------+------+------+------------- + |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+-------+-------------- -+----------+---------+------+------+------------- + | 1 |简单 |这个_ |范围 |值1 |值1 | 4 |空 | 3303 |使用位置 | +----+-------------+--------+-------+-------------- -+----------+---------+------+------+------------- + 但是,当使用 ORDER BY 时,我得到“使用文件排序”: 解释 select ... from values_table this_ where this_.value1 在 12345678 和 12349999 之间 order by this_.value2 asc limit 10; +----+-------------+--------+-------+-------------- -+----------+---------+------+------+------------- ----------------+ |编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外 | +----+-------------+--------+-------+-------------- -+----------+---------+------+------+------------- ----------------+ | 1 |简单 |这个_ |范围 |值1 |值1 | 4 |空 | 3303 |使用哪里;使用文件排序 | +----+-------------+--------+-------+-------------- -+----------+---------+------+------+------------- ----------------+关于表格内容的一些附加信息:
从值表中选择最小值(值 1)、最大值(值 1); +---------------+---------------+ |最小值(值 1)|最大值(值2)| +---------------+---------------+ | 0 | 4294967295 | +---------------+---------------+ ... 从值表中选择最小值(值 2)、最大值(值 2); +---------------+---------------+ |最小值(值 2)|最大值(值2)| +---------------+---------------+ | 1 | 953359 | +---------------+---------------+如果需要任何进一步的信息来回答这个问题,请告诉我。
提前非常感谢!
更新 #1: 添加新的复合索引 (ALTER TABLE values_table ADD INDEX (value1, value2);) 并不能解决问题。添加这样的索引后,您仍然会得到“使用文件排序”。
更新 #2: 我在问题中没有提到的一个约束是,我宁愿更改表的结构(比如添加索引等)而不是更改使用的 SQL 查询. SQL 查询是使用 Hibernate 自动生成的,因此请考虑那些或多或少是固定的。
【问题讨论】:
-
我假设您在更新中的意思是 value1,value2,是吗?
-
没关系,因为@Quassnoi 对 value1 范围的解释,这无论如何都行不通。它适用于 value1 的单个值,但我没有很好地阅读这个问题。祝你好运。
-
您是直接在查询中使用字段还是使用函数?像时间戳字段和 WEEK(timestamp)。
-
heikogerlach:字段按原样使用。没有使用任何函数。
-
+1 写得很好的问题
标签: mysql performance optimization