回答

收藏

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

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

我有一个中等大小的表,目前有277k条记录,我正在尝试对其进行FULLTEXT搜索。在进入“发送数据”阶段之前,搜索似乎非常快。
* {$ ~" c; J' q3 ~) |; {$ B8 U桌子:" R0 T5 g7 [/ A6 U7 w
CREATE TABLE `sqinquiries_inquiry` (
' q4 X0 U# n+ K  N0 I& l' N" o  `id` int(11) NOT NULL AUTO_INCREMENT,
+ p- U* N5 P( I. Q6 k- z! \: M  `ts` datetime NOT NULL,
# {; f: W9 W' j, U2 A  `names` longtext NOT NULL,& i0 n% Z' _8 v/ i- {
  `emails` longtext NOT NULL,: g! j2 J' W1 j0 O  V$ \
  PRIMARY KEY (`id`),
; H0 |. {$ b0 ^  FULLTEXT KEY `sqinquiries_inquiry_search` (`names`,`emails`)
# T. a6 D% |5 {, h) ENGINE=MyISAM AUTO_INCREMENT=305560 DEFAULT CHARSET=latin1
# j% |9 V( W' Y) ?& s9 x查询:: Q' V& D+ N3 D7 l1 y
SELECT * FROM `sqinquiries_inquiry` WHERE (
) N, G9 w0 R1 C( ^  MATCH (`sqinquiries_inquiry`.`names`) AGAINST ('smith' IN BOOLEAN MODE) OR6 V) _+ n" e0 V
  MATCH (`sqinquiries_inquiry`.`emails`) AGAINST ('smith' IN BOOLEAN MODE)5 k6 k) T% {3 X, E' U
) ORDER BY `sqinquiries_inquiry`.`id` DESC LIMIT 100
9 t2 S9 a+ F1 i* p  M- e个人资料:( 我删除了看似无用的信息)# Z0 Z% {8 q( u; N! v7 u2 F
+-------------------------+----------+
/ z0 s4 p$ p7 W4 j& D| Status                  | Duration |
, e9 G0 o( Q2 c4 x$ L+-------------------------+----------+
3 N( J, {* u- B' K* ^| preparing               | 0.000014 | 5 j5 a; H6 [: ~7 T3 N! R2 Q
| FULLTEXT initialization | 0.000015 | ( J3 R+ B1 Z+ C* f7 r) S- ?" M
| executing               | 0.000004 |
+ N5 F) {4 m- L3 U4 }, _& W| Sorting result          | 0.000008 | ; ?1 j8 X, B* h* V' q) {
| Sending data            | 2.247934 | 1 ?4 t8 Y4 @; I7 b
| end                     | 0.000011 |
& e1 P* v# G+ c+ g0 r! m) n+ h| query end               | 0.000003 |
  P# ^! T. E! Z( e. Z* Z+-------------------------+----------+
# O' b* F& j- o9 ]在DESCRIBE看起来不错,一个简单的内衬: 该描述:
. c; S( @3 K0 Tid: 1
- N$ c# C! H! D) dselect_type: SIMPLE
. L# Z7 n# h6 s$ m: |table: sqinquiries_inquiry, s1 [+ w, c, M: R2 }  u
type: index
+ t" H' r3 A4 B2 n' U; k; Kpossible_keys: NULL2 b3 S, r7 q3 @; O5 h9 T  L
key: PRIMARY
' u- L# o  h! r* l8 B5 q; C* Fkey_len: 4
$ g9 \# ^4 i1 L  D+ eref: NULL% P, }: X  E  i( k* @' n) |, R& e
rows: 100
' M- V( g7 ?# h9 q5 T9 @Extra: Using where
3 M1 h6 U, D) I* y$ u因此,我不了解的是2.25秒的发送数据来自何处?我在Python和控制台mysql应用程序中都看到了类似的性能,两者都连接到localhost。6 O& X" t  r# g: V2 I4 w. O4 w
更新:
# Y+ ~: C8 |* R每个请求平均行大小的注释为:53.8485
( U  c7 b0 w" @1 N9 i( ^根据评论,这是DESCRIBE上面的内容。
2 C: }3 @# k" H2 h

; Q3 @8 p$ E% ^( k2 g5 Q               
' k# V. e7 R, g, q解决方案:
4 a4 R8 p! z! N% V                # i& Q% |6 w3 ?( d) V8 }" Q( F

) Y8 F8 N( ]' Z' T9 P8 d8 z1 N  T
- M8 V1 O0 y; T- R- O4 o% V# w" z                & x4 ]. }* C' D4 q" j: [/ X: y8 W2 v
在DESCRIBE看起来不错,简单的一行。9 k% ]; b8 ~3 h# R% h' s, p
( }4 [$ S! O- R# z0 _/ a
由于您在查询中仅使用一个表,因此只能使用一个表。
/ `7 o/ t, ~' T- d- k# u* W: _但是,您的查询不使用FULLTEXT索引。
+ t! _6 l6 B* Y  y2 }# ~为了使索引可用,您应该稍微重写一下查询:" x  d# e; ^9 D* C, W9 e
SELECT  *1 l* u, x% h; m  _* f9 j
FROM    sqinquiries_inquiry
* Y" ^) e2 u  DWHERE   MATCH (names, emails) AGAINST ('smith' IN BOOLEAN MODE)7 c6 N+ {' h8 W& ~, d, I8 m- l+ \
ORDER BY
* o" i+ x5 C. V! `" [, G% c        id DESC! |9 X/ w+ }' R! Z9 }
LIMIT 100
9 v( U0 m/ e2 M* {2 |MATCH 仅当您与定义索引所在的确切列匹配时才使用索引。' B7 U% G+ K9 }
所以,你的查询使用的索引扫描id:Using index; Using where在您的尽头DESCRIBE。
/ V5 B) {: D3 B. xSending data 这是很容易让人误解的:实际上,这是上一次操作结束到当前操作结束之间的时间。
( c# E* m) z/ s& H例如,我只运行了以下查询:
0 V0 a4 v5 y8 D0 d& fSET profiling = 1;' \; t6 B7 o% r% ~" G
SELECT  *6 l% I& _% F0 q; p. {' g
FROM    t_source8 T: r0 U  i, u: |
WHERE   id + 1 = 999999;! S* t& b* _9 U. H8 T
SHOW PROFILE FOR QUERY 39;
$ t: Y' A- `: a. F- D它返回了单行和此配置文件:# j% A; B& A# G; _. d; s
'starting', 0.0001064 F  f% x" i8 R
'Opening tables', 0.000017
4 J, m& \( T% f' A1 Q& B$ \* J. p- E'System lock', 0.000005
2 `* V2 }0 y; ?' f# A'Table lock', 0.000014
' P  @! _9 {+ K' L% a4 O'init', 0.000033
$ @$ U) S1 e% n* d/ k/ c) u'optimizing', 0.000009
- L: f2 o! Q; ?'statistics', 0.000013
* K# w8 I  O5 a/ H'preparing', 0.000010$ D! ^% J& c2 b: s! F
'executing', 0.0000037 E; K2 @2 i# i  C; v3 `) G
'Sending data', 0.126565
- q( `! v9 p0 z0 n'end', 0.000007( L- Y2 D" l1 N4 _1 b. N  _' a6 V& D
'query end', 0.0000049 m. r0 B4 T1 {' L1 N
'freeing items', 0.0000531 z" W# h3 S8 x( v- M* d
'logging slow query', 0.000002
4 o& c, v. _+ i. a& Y! {. G" w, @'cleaning up', 0.000005
4 V5 K: N4 p% C' a由于索引不可用,因此MySQL需要执行全表扫描。- [: e( ]2 F4 K
0.126565 秒是从执行开始(读取第一行的时间)到执行结束(从最后一行发送到客户端的时间)开始的时间。. u/ R2 L6 l% h' X
最后一行位于表的最末端,花了很长时间才找到并发送它。
( O% i6 i# C1 H/ XP. S. 编辑删除了downvote
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则