|
我有一个中等大小的表,目前有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  |
|