回答

收藏

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

技术问答 技术问答 397 人阅读 | 0 人回复 | 2023-09-14

我有一个中等大小的表,目前有277k条记录,我正在尝试对其进行FULLTEXT搜索。在进入“发送数据”阶段之前,搜索似乎非常快。- e# F$ c, u: v" j! k' d$ x; n
桌子:  V" l  t% j5 h, K8 ?
CREATE TABLE `sqinquiries_inquiry` (4 k1 ~; O5 t1 O# `' `  x
  `id` int(11) NOT NULL AUTO_INCREMENT,
6 u8 E; E+ L* X& ^' X0 k0 J) z  `ts` datetime NOT NULL,
! F; _+ j( B# ]/ V( m- x: s: e% ]  `names` longtext NOT NULL,
* ~$ W2 o! m0 m. E8 c3 W% h/ O  `emails` longtext NOT NULL,
- B0 C8 i3 m( b2 y- j( _# _  PRIMARY KEY (`id`),
/ Z1 l' o8 B# V9 n3 p  FULLTEXT KEY `sqinquiries_inquiry_search` (`names`,`emails`)
% p- p, z, }( G' |) ENGINE=MyISAM AUTO_INCREMENT=305560 DEFAULT CHARSET=latin1
7 Z9 t4 U* t; l& E3 h- d  @4 O查询:
+ A8 k8 c1 y$ y9 y# z# b) vSELECT * FROM `sqinquiries_inquiry` WHERE (' I) |3 |4 N, U- L& p0 }- Z
  MATCH (`sqinquiries_inquiry`.`names`) AGAINST ('smith' IN BOOLEAN MODE) OR* P" _7 C% o. N
  MATCH (`sqinquiries_inquiry`.`emails`) AGAINST ('smith' IN BOOLEAN MODE)
3 T+ s7 x) g% o) ORDER BY `sqinquiries_inquiry`.`id` DESC LIMIT 100' w* F8 G3 G' \3 }# ]# Y6 K
个人资料:( 我删除了看似无用的信息)
0 g! B1 r6 g4 ^. W( A6 {. f2 n+-------------------------+----------+; y. l/ F& i3 Q( q
| Status                  | Duration |  u0 B% F3 I2 ]8 p6 H/ l
+-------------------------+----------+6 \# b6 [# `8 ]9 a, E  r
| preparing               | 0.000014 | ! ~3 c5 Z0 }- `# R3 ]( @) [0 p
| FULLTEXT initialization | 0.000015 |
8 s7 j4 A3 Y" @7 h! g| executing               | 0.000004 |
* A9 F: c! r) F; Q3 G. P& p0 T+ ^| Sorting result          | 0.000008 | 7 w. G: H/ b) M# a! z
| Sending data            | 2.247934 | " o( d  w" x  |$ v% v7 m
| end                     | 0.000011 |
1 ~9 G1 Z' w3 R7 w| query end               | 0.000003 | + ^, o4 {! Y$ |/ X. B
+-------------------------+----------+
( ~+ a0 S4 `9 R+ Y在DESCRIBE看起来不错,一个简单的内衬: 该描述:+ M) e# c+ a4 k
id: 17 u; ^( j4 A5 ~- ?' b$ C
select_type: SIMPLE
" h( a: `  J& {table: sqinquiries_inquiry" x: C  ]' W* _0 T
type: index' i1 c( ]5 A& U  t$ x+ I
possible_keys: NULL8 A5 h/ _7 m! t+ O- A
key: PRIMARY
8 C& ?* x7 j6 d! s! z6 Bkey_len: 4 9 P7 p% U3 ]& U2 [4 O
ref: NULL6 C3 E0 g  F6 T$ e# G
rows: 100
, [1 ]7 _; v5 e5 j9 `Extra: Using where' s( y1 U* U) d
因此,我不了解的是2.25秒的发送数据来自何处?我在Python和控制台mysql应用程序中都看到了类似的性能,两者都连接到localhost。
* _! j1 i; r# }0 H' L更新:8 ^( X+ w4 p4 D+ L9 ]- d
每个请求平均行大小的注释为:53.8485' `) A- B7 @) [9 [3 N. c
根据评论,这是DESCRIBE上面的内容。* S3 p* s' M- P. ?4 w# |1 m

5 F! t) K& S6 k. K, V! \  T               
- g+ R- ^% P& t6 T4 U% F6 Q  }解决方案:% X; V8 p( C2 h9 O/ R6 c. K/ N$ V  |
                ) Z' u( B  A8 v
* G: V' Q* f4 ~( u7 F
$ r7 k9 r( U  O4 i5 P
               
+ T! A* O& Z. v! F在DESCRIBE看起来不错,简单的一行。6 K) O3 X* M  n  ?, d2 @

+ B- l- n. O: [0 H由于您在查询中仅使用一个表,因此只能使用一个表。
5 H) k/ D" |5 L% g* }4 ]- u- A& y0 H但是,您的查询不使用FULLTEXT索引。4 g: ^: N6 W8 ^- ]" P& s% f
为了使索引可用,您应该稍微重写一下查询:0 o- m$ e4 v! f" J) v8 t2 ?' L
SELECT  *
3 t% @7 V8 g7 p. T( F( d" M6 C5 b* @FROM    sqinquiries_inquiry0 E, L/ _( o# u
WHERE   MATCH (names, emails) AGAINST ('smith' IN BOOLEAN MODE)  z& b/ ]: L. _0 q7 B. \
ORDER BY
" Q7 u: Z. Z  r8 B- J; S6 K" {        id DESC
* c$ [) D# H0 m3 ^# \& GLIMIT 100
: N7 T& ^/ L1 n! J  ~% w) I# B9 UMATCH 仅当您与定义索引所在的确切列匹配时才使用索引。
1 l- V! L- ]' }/ B9 |所以,你的查询使用的索引扫描id:Using index; Using where在您的尽头DESCRIBE。
: X: f8 I+ R% @8 Q  ESending data 这是很容易让人误解的:实际上,这是上一次操作结束到当前操作结束之间的时间。$ J* J- U  Z0 K8 I; l* c7 r
例如,我只运行了以下查询:- x' R" \  w$ V/ Z8 j* K- _7 K
SET profiling = 1;
# J2 O# r* t/ G% T+ Y( FSELECT  *
  W6 ^6 \: @1 _3 L2 kFROM    t_source
/ C9 a/ S3 b* M9 ]) S. K* vWHERE   id + 1 = 999999;
) A# T2 D5 W/ [8 N& }0 M6 S! sSHOW PROFILE FOR QUERY 39;7 w& v7 b( h! s  s/ o4 h0 b
它返回了单行和此配置文件:9 y# T# k0 |- u: C3 s+ ]
'starting', 0.000106
6 ~* E' R% S  l' n'Opening tables', 0.000017- C4 @' q' h3 M: }
'System lock', 0.000005
. m" z' V: w6 f2 P5 i' p( N'Table lock', 0.000014$ A. T5 Y, t1 O& u
'init', 0.000033! s+ O2 \5 A8 b
'optimizing', 0.000009
0 q2 \! R+ W5 H9 Z% E# b4 t'statistics', 0.0000132 Z% ?' p- C# Q9 g5 D
'preparing', 0.000010
9 y; ]. h% V4 h'executing', 0.000003) ?7 w  H2 W, l5 s7 f/ }
'Sending data', 0.126565
' ?1 t  g* W; X! H4 E9 e' ~'end', 0.000007
9 V/ ^, O5 Q; |- ?'query end', 0.000004. Y/ O8 z2 M+ k4 d" ~% ^
'freeing items', 0.0000531 @; n, G' y4 P& g" }$ U2 H' R
'logging slow query', 0.000002& X7 E! v' `6 _5 q. G
'cleaning up', 0.000005
% @! M$ n/ m; T& p由于索引不可用,因此MySQL需要执行全表扫描。/ ~2 V/ _. f% E
0.126565 秒是从执行开始(读取第一行的时间)到执行结束(从最后一行发送到客户端的时间)开始的时间。
3 S! X) W, Y! J1 v) B: u" n9 Y最后一行位于表的最末端,花了很长时间才找到并发送它。" M3 W8 `5 |) a
P. S. 编辑删除了downvote
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则