回答

收藏

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

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

我有一个中等大小的表,目前有277k条记录,我正在尝试对其进行FULLTEXT搜索。在进入“发送数据”阶段之前,搜索似乎非常快。5 e# i4 _$ T& j& E4 h% d( k
桌子:
" \# j9 M( C% o* d0 I6 BCREATE TABLE `sqinquiries_inquiry` (
( w. V6 L7 j: w3 M  `id` int(11) NOT NULL AUTO_INCREMENT,
4 u) w0 J& i5 y  `ts` datetime NOT NULL,+ o, {' m* X& b3 _1 F. _
  `names` longtext NOT NULL,5 k8 R1 I) c0 O/ X- [
  `emails` longtext NOT NULL,
9 k$ ]/ I7 ?! p9 G$ w0 P1 L- N  PRIMARY KEY (`id`),
0 D) y8 A- N" t. o8 e( R; A  FULLTEXT KEY `sqinquiries_inquiry_search` (`names`,`emails`)
/ o% A7 W( h( p$ a1 T2 w- Q) ENGINE=MyISAM AUTO_INCREMENT=305560 DEFAULT CHARSET=latin19 _) V! g2 [* A5 i! a9 K
查询:
" D9 m! O' M8 A' S" dSELECT * FROM `sqinquiries_inquiry` WHERE (. n; g; Z7 G7 t/ {! v: Z( L3 r4 W
  MATCH (`sqinquiries_inquiry`.`names`) AGAINST ('smith' IN BOOLEAN MODE) OR- I. X. |+ E8 b7 b9 ?
  MATCH (`sqinquiries_inquiry`.`emails`) AGAINST ('smith' IN BOOLEAN MODE)- T! a: s5 _& Z. L! V+ Y$ S
) ORDER BY `sqinquiries_inquiry`.`id` DESC LIMIT 100
& [. l$ ?2 F; Z个人资料:( 我删除了看似无用的信息)
  e- R) [# Z' v7 k2 N, l3 m/ r1 f+-------------------------+----------+
$ ^2 {3 S! |& c# d4 @5 W9 q| Status                  | Duration |1 x4 N3 p+ w! y, M6 ]
+-------------------------+----------+
/ T5 ]9 @, b% W: Y% h| preparing               | 0.000014 |
2 m0 c& M2 c1 H: |# y5 l2 Y| FULLTEXT initialization | 0.000015 |
3 G  u  M) V, b0 W8 k: R| executing               | 0.000004 |
  A: V% S: T! k8 Z7 ~| Sorting result          | 0.000008 |
% t* g% z; ]3 U0 y0 M/ Y% n( d| Sending data            | 2.247934 | 2 o0 I; u2 M" o# Y, Y; |1 S" t4 a2 o
| end                     | 0.000011 |
3 e, |$ i/ H% Z* G0 C' D, R. w| query end               | 0.000003 |
" W; {* Q# r$ E' j$ P5 y+-------------------------+----------+
( J7 p- Z* `3 }6 k9 j' c( Q: K! W# v$ I* _在DESCRIBE看起来不错,一个简单的内衬: 该描述:' I, C' F# G) ?/ A8 a
id: 1# b1 v( Z) L& U& E
select_type: SIMPLE
/ `7 H8 o: D8 f' w9 wtable: sqinquiries_inquiry
, ~* g4 U: r2 `. ~* b8 v# ?% c4 btype: index
6 a! p2 m/ W4 U  \possible_keys: NULL
+ p0 c0 h9 n8 m1 T+ p# I6 nkey: PRIMARY
7 L* O* `* x, Z* i5 Q! Xkey_len: 4
4 z& L# t6 K" ]5 J3 B/ S7 ~1 r0 ]ref: NULL
  F, ]6 F) T6 i0 @rows: 100. H% W6 G% e0 \) j, f6 I1 O
Extra: Using where1 Z: c+ e. D1 V8 ~
因此,我不了解的是2.25秒的发送数据来自何处?我在Python和控制台mysql应用程序中都看到了类似的性能,两者都连接到localhost。
1 S! o; E, g/ ^$ a9 `5 M0 M* B! L$ Q更新:2 t; E0 G5 A5 f$ J& x, W. B! ]
每个请求平均行大小的注释为:53.84855 T0 k$ q, i+ [4 v% J
根据评论,这是DESCRIBE上面的内容。  V& P  q8 f# ~
+ i& M! q4 Q1 X+ p
                % R* T* G" Q8 N7 j' u
解决方案:: q) O1 Z& u2 R
                $ [- \# [3 p* }# _, p0 _

4 m* l$ \0 f( d3 r; `' M
# F. [3 O* ?% Z- c                , ?- K8 {4 T3 j, o& _( b
在DESCRIBE看起来不错,简单的一行。1 v2 I+ m- r$ c% D0 E, q; T6 g/ q

  W* U# B( C6 A+ Y! s* z0 E8 v7 z由于您在查询中仅使用一个表,因此只能使用一个表。  P' q& N; G* o8 O8 v
但是,您的查询不使用FULLTEXT索引。
6 }2 X4 k! C2 b  V6 k为了使索引可用,您应该稍微重写一下查询:
% b7 [2 j9 z) j4 qSELECT  *
* H  m. W. R' A  J1 ~  n6 l# TFROM    sqinquiries_inquiry& @: S3 r: D, N
WHERE   MATCH (names, emails) AGAINST ('smith' IN BOOLEAN MODE)
  @' I  x. A0 i9 ?ORDER BY, C& V/ p! C1 b* k( [
        id DESC! e: e" K) L- ^, a) t
LIMIT 100
  H9 N1 u1 A; F- D( TMATCH 仅当您与定义索引所在的确切列匹配时才使用索引。
1 m& E/ S( y! v, Q所以,你的查询使用的索引扫描id:Using index; Using where在您的尽头DESCRIBE。
. q2 D2 D- U* mSending data 这是很容易让人误解的:实际上,这是上一次操作结束到当前操作结束之间的时间。$ I5 P# F" P$ i) R
例如,我只运行了以下查询:
2 a0 [! x, v, WSET profiling = 1;
( O8 `0 D" X: t, ~. b$ {SELECT  *; q, B6 n/ t, w1 G
FROM    t_source
6 ^  v# ^- O+ A$ zWHERE   id + 1 = 999999;( ?% K% c3 @4 q$ ^' ]
SHOW PROFILE FOR QUERY 39;
3 s( T6 R5 [' E9 v+ x它返回了单行和此配置文件:% Q# r2 ~2 X* D# W. }  Y
'starting', 0.000106, r0 R2 |. X$ T- n, q/ I
'Opening tables', 0.000017
) q; G# Y- |* T* U$ }. _'System lock', 0.000005
5 W$ n. J. F+ z8 `0 r'Table lock', 0.000014
2 A$ s& j& o8 U* m'init', 0.000033
& I" [: H! q: d0 q0 z& y% [: [8 Y0 ^0 {'optimizing', 0.000009
+ ^! P" m* M1 L$ ^2 _/ t'statistics', 0.000013
8 @5 P/ x$ g3 R9 P'preparing', 0.000010
; B% D# D+ V* c: T  O'executing', 0.000003$ F7 {8 y' o/ K7 t4 H1 `
'Sending data', 0.126565
" q) l4 h& l- t. y'end', 0.000007/ o. b& \" u; @
'query end', 0.0000041 V4 [) s/ f3 h9 {1 [
'freeing items', 0.000053
7 \6 `# |- r% T* j3 Z$ J8 A'logging slow query', 0.000002. w4 M- L$ t" e' s- o* o. P
'cleaning up', 0.000005
0 Z7 Y) j: `2 i/ P& ]$ K5 {由于索引不可用,因此MySQL需要执行全表扫描。
) r9 m% T. U8 B0.126565 秒是从执行开始(读取第一行的时间)到执行结束(从最后一行发送到客户端的时间)开始的时间。
0 m( [% C# A0 s5 x7 X5 O) \, a* Z最后一行位于表的最末端,花了很长时间才找到并发送它。; L, t$ T6 Z- ]5 `
P. S. 编辑删除了downvote
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则