gpt4 book ai didi

MySQL 和预排序表

转载 作者:行者123 更新时间:2023-11-29 02:34:36 26 4
gpt4 key购买 nike

我的服务器上有一个 MySQL 数据库,其中一个表具有主索引和所有其他列的全文索引。通常我会执行一个 SELECT 语句,例如:

SELECT * FROM myTable WHERE MATCH(myInfo) AGAINST ('stuff') ORDER BY id 限制 30

这工作正常,但速度很慢 - ORDER BY id 子句大大减慢了速度,尤其是当经常发生大量点击时。例如,没有子句的搜索需要大约 0.001 秒,而有子句的搜索需要 0.6 秒(但会产生理想的结果)。

  1. 是否可以对我的表进行预排序,以便我永远不需要 ORDER BY 运算符?该表是静态的——数据只会被读取。毕竟,必须对 5000 次匹配进行排序,然后返回(顶部)30 次似乎是一种浪费,因为这可以很容易地提前决定。

  2. 如果没有,我该怎么办?

PS - MATCH 似乎把事情搞得一团糟,而 LIKE 虽然速度慢但不会,因此不需要 ORDER BY

%%编辑 #1,输出 EXPLAIN SELECT on phpMyAdmin

id  select_type table   type    possible_keys   key key_len ref rows    Extra

1 SIMPLE myTable fulltext full_index full_index 0 1 Using where

编辑#2,更好的解释

表示时间用于对结果进行排序。

状态时间

从 0.000016 开始

正在检查查询 0.000048 的查询缓存

开表 0.000012

系统锁0.000007

表锁0.000024

初始化 0.000026

优化 0.000010

统计 0.000017

准备 0.000012

全文初始化0.000199

执行 0.000004

排序结果0.001663

发送数据0.000304

结束 0.000005

查询结束0.000004

释放元素 0.000025

将结果存储在查询缓存 0.000007

记录慢速查询 0.000003

清理 0.000005

最佳答案

1-Is it possible to presort my table?

不,表格已经被PK预排序了。
全文索引强制按照该索引指定的顺序访问行。
因此,之后需要对其进行重新排序。

2- what can I do about this?

如果您不介意得到稍微不同的结果,您可以将查询更改为

  SELECT * FROM 
(
SELECT * FROM myTable WHERE MATCH(myInfo) AGAINST ('stuff') LIMIT 30
) as s ORDER BY id

要获得接下来的 30 个结果,请执行 limit 30,30 等操作。

您还可以通过不选择所有行而只选择您需要的行来加快查询速度。这将限制 MySQL 必须保留在内存中的数据量,从而限制排序时必须移动的数据量。

SELECT id, myinfo FROM mytable ....

关于MySQL 和预排序表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7241316/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com