东南西北风 发表于 2023-9-14 12:03:39

MySQL``结束数据''的速度非常慢

我有一个中等大小的表,目前有277k条记录,我正在尝试对其进行FULLTEXT搜索。在进入“发送数据”阶段之前,搜索似乎非常快。
桌子:
CREATE TABLE `sqinquiries_inquiry` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ts` datetime NOT NULL,
`names` longtext NOT NULL,
`emails` longtext NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `sqinquiries_inquiry_search` (`names`,`emails`)
) ENGINE=MyISAM AUTO_INCREMENT=305560 DEFAULT CHARSET=latin1
查询:
SELECT * FROM `sqinquiries_inquiry` WHERE (
MATCH (`sqinquiries_inquiry`.`names`) AGAINST ('smith' IN BOOLEAN MODE) OR
MATCH (`sqinquiries_inquiry`.`emails`) AGAINST ('smith' IN BOOLEAN MODE)
) ORDER BY `sqinquiries_inquiry`.`id` DESC LIMIT 100
个人资料:( 我删除了看似无用的信息)
+-------------------------+----------+
| Status                  | Duration |
+-------------------------+----------+
| preparing               | 0.000014 |
| FULLTEXT initialization | 0.000015 |
| executing               | 0.000004 |
| Sorting result          | 0.000008 |
| Sending data            | 2.247934 |
| end                     | 0.000011 |
| query end               | 0.000003 |
+-------------------------+----------+
在DESCRIBE看起来不错,一个简单的内衬: 该描述:
id: 1
select_type: SIMPLE
table: sqinquiries_inquiry
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 100
Extra: Using where
因此,我不了解的是2.25秒的发送数据来自何处?我在Python和控制台mysql应用程序中都看到了类似的性能,两者都连接到localhost。
更新:
每个请求平均行大小的注释为:53.8485
根据评论,这是DESCRIBE上面的内容。

               
解决方案:
               


               
在DESCRIBE看起来不错,简单的一行。

由于您在查询中仅使用一个表,因此只能使用一个表。
但是,您的查询不使用FULLTEXT索引。
为了使索引可用,您应该稍微重写一下查询:
SELECT*
FROM    sqinquiries_inquiry
WHERE   MATCH (names, emails) AGAINST ('smith' IN BOOLEAN MODE)
ORDER BY
      id DESC
LIMIT 100
MATCH 仅当您与定义索引所在的确切列匹配时才使用索引。
所以,你的查询使用的索引扫描id:Using index; Using where在您的尽头DESCRIBE。
Sending data 这是很容易让人误解的:实际上,这是上一次操作结束到当前操作结束之间的时间。
例如,我只运行了以下查询:
SET profiling = 1;
SELECT*
FROM    t_source
WHERE   id + 1 = 999999;
SHOW PROFILE FOR QUERY 39;
它返回了单行和此配置文件:
'starting', 0.000106
'Opening tables', 0.000017
'System lock', 0.000005
'Table lock', 0.000014
'init', 0.000033
'optimizing', 0.000009
'statistics', 0.000013
'preparing', 0.000010
'executing', 0.000003
'Sending data', 0.126565
'end', 0.000007
'query end', 0.000004
'freeing items', 0.000053
'logging slow query', 0.000002
'cleaning up', 0.000005
由于索引不可用,因此MySQL需要执行全表扫描。
0.126565 秒是从执行开始(读取第一行的时间)到执行结束(从最后一行发送到客户端的时间)开始的时间。
最后一行位于表的最末端,花了很长时间才找到并发送它。
P. S. 编辑删除了downvote :)
页: [1]
查看完整版本: MySQL``结束数据''的速度非常慢