gpt4 book ai didi

sql - MySQL "Sending data"非常慢

转载 作者:IT老高 更新时间:2023-10-29 00:03:26 24 4
gpt4 key购买 nike

我有一个中等大小的表,目前有 277k 条记录,我正在尝试对其进行 FULLTEXT 搜索。在进入发送数据阶段之前,搜索似乎非常快。

table :

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 秒的 Sending data 是从哪里来的?我在 Python 和控制台 mysql 应用程序中看到了类似的性能,都连接到 localhost

更新:

  • 每条请求平均行大小的评论是:53.8485
  • 根据评论,这里是上面的 DESCRIBE

最佳答案

The DESCRIBE looks great, a simple one liner.

由于您在查询中只使用一个表,因此只能是单行表。

但是,您的查询不使用 FULLTEXT 索引。

为了使索引可用,您应该稍微重写查询:

SELECT  *
FROM sqinquiries_inquiry
WHERE MATCH (names, emails) AGAINST ('smith' IN BOOLEAN MODE)
ORDER BY
id DESC
LIMIT 100

MATCH 仅当您与定义索引的确切列集匹配时才使用索引。

所以你的查询使用 id 上的索引扫描: Using index;在 DESCRIBE 的最后使用 where

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. 已编辑以删除不赞成票 :)

关于sql - MySQL "Sending data"非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445597/

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