【发布时间】:2012-08-08 05:30:52
【问题描述】:
我有一个由 6 个数字组成的表作为主键
CREATE TABLE table1 ( num1 decimal, num2 int, num3 int, num4 bigint, num5 bigint, num6 bigint,
PRIMARY KEY (num1, num2, num3, num4, num5, num6))
我需要按排序顺序访问该表,并且经常需要查询该表以按顺序查找接下来的 N 个大数及其相关数据。
所以我写的查询是这样的
SELECT * FROM table1 WHERE
num1 >? OR (
(num1 == ? AND num2 > ?) OR (
(num1 == ? AND num2 == ? AND num3 > ?) OR (
(num1 == ? AND num2 == ? AND num3 == ? AND num4 > ? OR (
(num1 == ? AND num2 == ? AND num3 == ? AND num4 == ? AND num5 > ?) OR (
(num1 == ? AND num2 == ? AND num3 == ?
AND num4 == ? AND num5 == ? AND num6 > ?)))))) ORDER BY num1, num2, num3, num4, num5, num6
LIMIT ?;
这是我能看到的查找下一个最大键的最佳方法,但它确实按索引的顺序查询....查询需要几秒钟,这是我不喜欢的.
有什么方法可以提高性能吗?这需要几秒钟才能在 1000 万行的表上执行,我需要它在 100 毫秒左右执行更多。
查询计划:
"SEARCH TABLE table1 USING INDEX sqlite_autoindex_table1_1 (num1>?) (~250000 rows)"
"SEARCH TABLE table1 USING INDEX sqlite_autoindex_table1_1 (num1=? AND num2>?) (~2 rows)"
"SEARCH TABLE table1 USING INDEX sqlite_autoindex_table1_1 (num1=? AND num2=? AND num3>?) (~2 rows)"
"SEARCH TABLE table1 USING INDEX sqlite_autoindex_table1_1 (num1=? AND num2=? AND num3=? AND num4>?) (~2 rows)"
"SEARCH TABLE table1 USING INDEX sqlite_autoindex_table1_1 (num1=? AND num2=? AND num3=? AND num4=? AND num5>?) (~1 rows)"
"SEARCH TABLE table1 USING INDEX sqlite_autoindex_table1_1 (num1=? AND num2=? AND num3=? AND num4=? AND num5=? AND num6>?) (~1 rows)"
"USE TEMP B-TREE FOR ORDER BY"
编辑:
为什么这不可能?我真的想在 INDEXED ORDER 中获取东西,与 ORDER BY 关键字生成的顺序相同?
【问题讨论】:
-
删除了我的答案,因为我提供的信息基于错误的数据库引擎...抱歉。
-
每列是否有单独的索引
-
这不应该是必需的,它使用索引它只是尝试在临时 b 树中对结果进行排序。 select * from table1 where num1 > ? AND num6 == 1 order by num1, num2, num3, num4, num5, num6 limit 1000 在 25 毫秒内执行,这些列的其他组合也是如此
标签: sql performance sqlite indexing query-optimization