sqlite SQL重新排序数据库而不是使用ORDER BY来提高性能有意义吗?

7dl7o3gd  于 2022-12-23  发布在  SQLite
关注(0)|答案(1)|浏览(130)

我有一个数据库与约120.000条目,我需要做子字符串比较(其中...像'测试%')的自动完成功能。数据库不会改变。
我有一个名为"相关性"的列,我希望搜索结果按相关性描述进行排序。我注意到,一旦我将"ORDER BY relevance DESC"添加到查询中,执行时间就会增加100%-因为我的查询已经平均花费了大约100毫秒,这会导致明显的延迟。
按相关性对整个数据库重新排序一次是否有意义,这样我就可以删除ORDER BY?我是否可以确定,当使用SQL搜索表时,它将始终按我添加行的顺序搜索数据库?
下面是我的查询现在的样子:

select *
from hao2_dict
where definitions like 'ba%'
   or searchable_pinyin like 'ba%'
ORDER BY relevance DESC
LIMIT 100

UPDATE:对于上下文,下面是我的DB结构:

以及一些时间测量:对搜索词"b %"使用索引(相关性DESC)会给我50ms,这比不使用索引要快。但是搜索词"banana %"需要超过1700ms,这比不使用索引要慢得多。以下是"explain"的结果:
b百分比:
0初始化0 27 0 0
1努普1 11 0 0
2整数100 1 0 0
3打开读取0 5 0 9 0
4打开读取2 4223 0 k(2,-,)0
5倒带2 26 2 0 0
6延迟寻道2 0 0 0
7列0 6 4 0
8函数1 3 2类似于(2)0
9如果2 13 0 0
10第0 4 6 0列
11函数1 5 2类似于(2)0
12如果不是2 25 1 0
13标识x行标识2 7 0 0
14第0 1 8 0列
15第0 2 9 0列
16第0 3 10 0列
17第0 4 11 0列
18第0列5 12 0
19第0列6 13 0
20列0 7 14 0
21第2列0 15 0
22真实亲和力15 0 0 0
23结果行7 9 0 0
12月24日跳转零1 26 0 0
25次2 6 0 1
26停止
27交易记录0 0 10 0 1
28字符串8 0 3 0 b % 0
29字符串8 0 5 0 b % 0
30转到0 1 0 0
香蕉%:
0初始化0 27 0 0
1努普1 11 0 0
2整数100 1 0 0
3打开读取0 5 0 9 0
4打开读取2 4223 0 k(2,-,)0
5倒带2 26 2 0 0
6延迟寻道2 0 0 0
7列0 6 4 0
8函数1 3 2类似于(2)0
9如果2 13 0 0
10第0 4 6 0列
11函数1 5 2类似于(2)0
12如果不是2 25 1 0
13标识x行标识2 7 0 0
14第0 1 8 0列
15第0 2 9 0列
16第0 3 10 0列
17第0 4 11 0列
18第0列5 12 0
19第0列6 13 0
20列0 7 14 0
21第2列0 15 0
22真实亲和力15 0 0 0
23结果行7 9 0 0
12月24日跳转零1 26 0 0
25次2 6 0 1
26停止
27交易记录0 0 10 0 1
28字符串8 0 3 0香蕉% 0
29字符串8 0 5 0香蕉% 0
30转到0 1 0 0

wsewodh2

wsewodh21#

我可以确定,当使用SQL搜索表时,它将始终按照我添加行的顺序搜索数据库吗?
不可以。SQL结果没有固有的顺序。它们 * 可能 * 按照您插入它们的顺序出现,但不能保证。
相反,在列上放置一个索引。索引按顺序保存它们的值。
但是,这只会处理排序,在上面的查询中,它仍然要搜索整个表中定义和searchable_pinyins匹配的行,一般来说,SQL每次只会对每个表使用一个索引;通常尝试使用两个是低效的,所以你需要一个多列索引来使这个查询不必搜索整个表 * 和 * 得到排序的结果,确保relevance是第一个,你需要索引列的顺序与你的排序相同。
(relevance, definitions, searchable_pinyins)将使查询只使用索引进行搜索和排序,添加(relevance, searchable_pinyins)还将处理按定义、searchable_pinyins或两者进行搜索。

相关问题