回答

收藏

MYSQL查询执行速度非常慢

技术问答 技术问答 112 人阅读 | 0 人回复 | 2023-09-13

我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。
: ~- y. X7 \2 Lif (($handle = fopen($filePath, "r")) !== FALSE) {+ @2 ?2 E4 T: b6 {) \! Y& p
            while (($peopleData = fgetcsv($handle, 10240, ",")) !== FALSE) {
" i7 t' X( u3 E4 z                if (count($peopleData) == $fieldsCount) {
0 p0 b0 X+ V4 r1 a, q& o( O//inside i check if user already exist (firstName & lastName & DOB)) t( a7 U4 c) l0 [
//if not, i check if email exist. if exist, update the records.
" |0 }' X9 H+ R, H7 L//other wise insert a new record.' h  e* W3 ]1 D) O1 L
}}}
' m2 O7 d3 |! u* `5 D5 r* ?
" W& j2 J! l2 k0 w, i9 I6 t下面是运行的查询。(我正在使用Yii框架)
& o; S) J: s( t% F$ F! [1 {) pSELECT * ( |4 O6 m: j/ ~+ U) t* }& [
FROM `AdvanceBulkInsert` `t` & k' b- d4 y/ B6 P! ?
WHERE renameSource='24851_bulk_people_2016-02-25_LE CARVALHO 1.zip.csv' / O+ b$ @+ P! H
LIMIT 1
1 t) I+ T  `& }* r8 oSELECT cf.*, ctyp.typeName, cfv.id as customId, cfv.customFieldId, . _( w8 }/ a6 c3 z0 ~) c: ?  w
       cfv.relatedId, cfv.fieldValue, cfv.createdAt / L# t& j( I. k4 h1 L1 X, D
FROM `CustomField` `cf`
1 F" M1 E' p+ Q: @" z3 k+ i    INNER JOIN CustomType ctyp on ctyp.id = cf.customTypeId
" H$ k! N+ ]4 ]# ~, _- C! v. i    LEFT OUTER JOIN CustomValue cfv on cf.id = cfv.customFieldId
* `* ~: l& H& ]  ^5 `                and relatedId = 0 5 `$ _4 t2 \# w, I+ B) T& c4 B
    LEFT JOIN CustomFieldSubArea cfsa on cfsa.customFieldId = cf.id 0 C8 A' V! K( R0 p
WHERE ((relatedTable = 'people' and enabled = '1')
. }2 J+ Y9 Q* N6 @9 i: H  AND (onCreate = '1'))
( V  n! o, Y( q* E' Y+ o  AND (cfsa.subarea='peoplebulkinsert') / v! T$ d& m+ `
ORDER BY cf.sortOrder, cf.label
9 a% z4 {8 x! w- j7 VSELECT * ' K  a; M! l5 U* Z7 p
FROM `User` `t` / F. R' v! {) u5 u' N
WHERE `t`.`firstName`='Franck' 6 t8 @7 K, }' t: [$ T, d  ?  ~& d
  AND `t`.`lastName`='ALLEGAERT ' + S1 H2 f! F8 \" R
  AND `t`.`dateOfBirth`='1971-07-29'
2 z! t0 Q- g3 T& m% O2 [  AND (userType NOT IN ("1"))
# O$ p( R+ o8 Y2 n! z+ bLIMIT 1
$ |) V. |9 j+ _$ ?0 y% @- x) I) R0 R8 o4 `4 E, z4 U4 e
如果存在,请更新用户:7 Q, N# _) n% J5 O. P
UPDATE `User` SET `id`='51394', `address1`='49 GRANDE RUE', : ?& H9 E3 F% m6 o6 s0 ?  @( t  e0 g
                  `mobile`='', `name`=NULL, `firstName`='Franck', 0 {; _, c* L& D
                  `lastName`='ALLEGAERT ', `username`=NULL, . [7 C2 J& l4 e& U, v- e! c+ u( k
                  `password`=NULL, `email`=NULL, `gender`=0, * g( [9 Z7 _8 }0 z; O
                  `zip`='60310', `countryCode`='DZ', ' F* b- u; h/ J  m* e! }
                  `joinedDate`='2016-02-23 10:44:18', . A5 u0 n" Y* k5 }
                  `signUpDate`='0000-00-00 00:00:00', ! k& _7 l# y* M( j' x
                  `supporterDate`='2016-02-25 13:26:37', `userType`=3, , P6 f4 k8 y* q& q. u
                  `signup`=0, `isSysUser`=0, `dateOfBirth`='1971-07-29', ) O& E8 n; g8 z. G2 C8 ]0 J! `
                  `reqruiteCount`=0, `keywords`='70,71,72,73,74,75',
2 ?8 S7 U2 U1 ^+ K                  `delStatus`=0, `city`='AMY', `isUnsubEmail`=0,
0 Q% Z, x6 Z" y# ~2 Q4 ^                  `isManual`=1, `isSignupConfirmed`=0, `profImage`=NULL, 0 U% c" Z. B8 U0 W( `
                  `totalDonations`=NULL, `isMcContact`=NULL, % I3 {3 r* r* I2 u& [0 b. Z
                  `emailStatus`=NULL, `notes`=NULL, ) _0 m% y: x; O# ^7 k7 q
                  `addressInvalidatedAt`=NULL,
! _2 z0 Z; Y3 [7 t3 w- y  c3 j8 z7 G/ E                  `createdAt`='2016-02-23 10:44:18', 3 q) p$ B: [7 s/ I4 W
                  `updatedAt`='2016-02-25 13:26:37', `longLat`=NULL
  Y* V; ~' d. x8 p# iWHERE `User`.`id`='51394'
$ C5 n0 i1 I& W, U1 k; {/ ?( ~/ ]7 R8 Y, J
如果用户不存在,请插入新记录。
4 Y. Z! P5 e/ I& o表引擎类型为MYISAM。仅电子邮件列具有索引。" ]9 r" O: {/ C' V8 Z3 O- k9 a
我该如何优化以减少处理时间?
$ ?8 m9 C  [" c; C) ~查询2花费了0.4701秒,这意味着30 000条记录将花费14103秒,大约235分钟。大约6个小时。
2 ?7 [. ~, b7 @0 C: m/ F更新
& N- b- \7 [. o$ ~+ M5 |+ \! X1 e  k- BCREATE TABLE IF NOT EXISTS `User` (
, f" t$ k0 s8 I+ z8 D  `id` bigint(20) NOT NULL,# b0 q- V1 K+ r: m9 v* k3 g! o
  `address1` text COLLATE utf8_unicode_ci,
  t* E8 c/ f! z/ N  `mobile` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,/ m' @9 V) `9 ~; W$ e
  `name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,2 w5 V1 u* W! [
  `firstName` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,2 k+ x) H4 I" x  L: M
  `lastName` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
5 k7 E* }* t, B* R' p* x  `username` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL,8 I4 d$ I4 q! ~) F+ O1 ]% M
  `password` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
% B5 Y0 q; }1 p5 g5 B  `email` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,* g3 i9 H8 q0 ?8 P# [
  `gender` tinyint(2) NOT NULL DEFAULT '0' COMMENT '1 - female, 2-male, 0 - unknown',
8 P! R, {& J. d& j8 I  `zip` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,. {( t/ ?1 H3 }% n& g% l
  `countryCode` varchar(3) COLLATE utf8_unicode_ci DEFAULT NULL,$ }$ r0 \) K( h- S8 ~
  `joinedDate` datetime DEFAULT NULL,- p  V( g( f7 J( a* ^
  `signUpDate` datetime NOT NULL COMMENT 'User signed up date',. K" I7 s# \% s) g
  `supporterDate` datetime NOT NULL COMMENT 'Date which user get supporter',
4 A/ n/ H/ U( {4 K& T! B  `userType` tinyint(2) NOT NULL,6 E' k# x( M3 D( J4 u; Y6 P1 X+ O2 m
  `signup` tinyint(2) NOT NULL DEFAULT '0' COMMENT 'whether user followed signup process 1 - signup, 0 - not signup',: G8 e% E' U" b- s/ b
  `isSysUser` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 - system user, 0 - not a system user',
0 w* ?, i/ j5 D  `7 s, H+ H* T" [  `dateOfBirth` date DEFAULT NULL COMMENT 'User date of birth',
" J8 ^) ^4 z3 t  `reqruiteCount` int(11) DEFAULT '0' COMMENT 'User count that he has reqruited',' [8 ]! C) ?* R$ h' u% O
  `keywords` text COLLATE utf8_unicode_ci COMMENT 'Kewords',9 C5 U: Q9 K# H1 U5 T& W
  `delStatus` tinyint(2) NOT NULL DEFAULT '0' COMMENT '0 - active, 1 - deleted',2 B  K7 h- |% z: W
  `city` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
* o1 p" A8 l( \  `isUnsubEmail` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0 - ok, 1 - Unsubscribed form email',
0 P# q. v% T5 K: ]7 f% j( B! m  `isManual` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0 - ok, 1 - Manualy add',) K6 h, Y$ H& O9 A% q8 ?2 p" y
  `longLat` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL COMMENT 'Longitude and Latitude',2 j0 [" y: a+ l4 J+ G
  `isSignupConfirmed` tinyint(4) NOT NULL DEFAULT '0' COMMENT 'Whether user has confirmed signup ',
* A! t7 ~# o9 n- V9 [( X6 Q& A1 n  `profImage` tinytext COLLATE utf8_unicode_ci COMMENT 'Profile image name or URL',! ^% `4 }; H# A- F
  `totalDonations` float DEFAULT NULL COMMENT 'Total donations made by the user',
" X8 I1 T" O4 [; |6 m3 {  `isMcContact` tinyint(1) DEFAULT NULL COMMENT '1 - Mailchimp contact',2 Q/ R" F# W9 I, ^: ~' v/ p
  `emailStatus` tinyint(2) DEFAULT NULL COMMENT '1-bounced, 2-blocked',* d! z. l7 C5 i: O
  `notes` text COLLATE utf8_unicode_ci,5 G! R- i1 t# _0 S
  `addressInvalidatedAt` datetime DEFAULT NULL,
: @# D8 `% I/ U8 _  `createdAt` datetime NOT NULL,
+ C( [- ]2 u; m0 l3 S0 Z( i  `updatedAt` datetime DEFAULT NULL
8 C% @4 V" S# E" J6 S) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
8 N& ^) S9 z9 D8 z. h' JCREATE TABLE IF NOT EXISTS `AdvanceBulkInsert` (
4 R" G2 @  @1 o* a, B2 n$ A  `id` int(11) NOT NULL,
6 ^' ~+ ]. v1 D$ O) T4 I7 R; {' n  `source` varchar(256) NOT NULL,
' w' `( I2 U8 a: C1 t  I6 i: Y  `renameSource` varchar(256) DEFAULT NULL,
! ^( m" }# ~0 F" ~  `countryCode` varchar(3) NOT NULL,
# U5 V0 u( j# a0 x4 t  `userType` tinyint(2) NOT NULL,) N' u+ o: p* H, e$ |0 C6 V/ [
  `size` varchar(128) NOT NULL,
; F: H; C) b% T4 D7 L7 h$ V  `errors` varchar(512) NOT NULL,& {: E! H4 {: k& B7 `
  `status` char(1) NOT NULL COMMENT '1ueued, 2:In Progress, 3:Error, 4:Finished, 5:Cancel',$ d& X6 H! M0 P  N3 C' |" A  R
  `createdAt` datetime NOT NULL,; N* `/ R, t* @9 z# T2 x6 d" `
  `createdBy` int(11) NOT NULL
! T7 ~* U( R( Z+ l) ENGINE=MyISAM DEFAULT CHARSET=latin1;" p/ O/ o; }- b3 @# u
CREATE TABLE IF NOT EXISTS `CustomField` (
: p9 H; ~( r( T! T% c8 _7 c  `id` int(11) NOT NULL,# z; L2 }) @+ `" C  t- c; L
  `customTypeId` int(11) NOT NULL,
( ?; ~5 |/ U/ e! f" h  `fieldName` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,+ y/ ?/ w$ P% x% B  v
  `relatedTable` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,. S8 s6 s) f- k/ S! Z0 l) U) v
  `defaultValue` text COLLATE utf8_unicode_ci,% }* v  K5 _4 B9 d0 Q0 q( j
  `sortOrder` int(11) NOT NULL DEFAULT '0',8 \. A) ]4 r8 I& s( A' `7 j0 p+ L- K
  `enabled` char(1) COLLATE utf8_unicode_ci DEFAULT '1',
4 t3 I, c" h$ z4 W. v  `listItemTag` char(1) COLLATE utf8_unicode_ci DEFAULT NULL," f7 R0 o- s; ^- m2 a: Z( L
  `required` char(1) COLLATE utf8_unicode_ci DEFAULT '0',/ R0 L) f. _' _9 f
  `onCreate` char(1) COLLATE utf8_unicode_ci DEFAULT '1',% O8 r, Q( Q0 e  `) E2 U8 [4 b
  `onEdit` char(1) COLLATE utf8_unicode_ci DEFAULT '1',
$ W! S5 i/ r/ J5 P# S7 R2 p  `onView` char(1) COLLATE utf8_unicode_ci DEFAULT '1',
) R; s! p7 P9 `; C' K: k  `listValues` text COLLATE utf8_unicode_ci,
1 }; i, t# Y4 }) I  j  `label` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,6 ~7 U6 j& n, X
  `htmlOptions` text COLLATE utf8_unicode_ci; N4 o: X+ U; q
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
4 v+ Q7 N) p% [! i' ~6 _* h5 T6 v3 zCREATE TABLE IF NOT EXISTS `CustomFieldSubArea` (
3 Y1 n0 E9 k; C  e( j( ^  `id` int(11) NOT NULL,
+ a, [5 L1 C' P# V# l0 ^9 j  `customFieldId` int(11) NOT NULL,
' c2 O1 y. J7 N6 L& P- r  `subarea` varchar(256) COLLATE utf8_unicode_ci NOT NULL
1 s6 ~$ T1 t+ C) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;  h" a) L  s! S/ N
CREATE TABLE IF NOT EXISTS `CustomValue` (
" w) y; l3 ^8 B7 _4 N  `id` int(11) NOT NULL,
. a, [8 \6 K" u( v7 l7 P; g; Q; B  `customFieldId` int(11) NOT NULL,
0 `' R8 L( ~, p4 V9 p8 o; ]" T  `relatedId` int(11) NOT NULL,
" P; Z4 t& i0 J6 @  `fieldValue` text COLLATE utf8_unicode_ci,
# q3 s* i6 l4 i+ M7 D% u$ D- x  `createdAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP; ^( ?4 {- G& R5 \: R
) ENGINE=MyISAM AUTO_INCREMENT=86866 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
5 d6 Y( e, H8 `; j! {0 t0 \" u               
+ h3 {) R/ A& j- ~, w9 X7 f5 \解决方案:
: l' N& Q  K/ u% P4 m                . r5 z( ?1 U$ [
. p$ x! I' Q; a5 a0 e8 X6 u' d4 d

' @  W" z% ^0 Q* P9 Z2 _                索引是您的朋友。- |( }* ?4 a/ e- j
UPDATE User ... WHERE id = ...-迫切需要ID索引PRIMARY KEY。
: U: V: Q' i! i/ {同样适用于renameSource。1 }5 f' o! p+ Z4 C/ y
SELECT *
$ Z. C$ ^- A- C8 e2 n' yFROM `User` `t` / Q2 |: {8 |6 a, g+ P
WHERE `t`.`firstName`='Franck' ) h3 J: t# D! c+ I
  AND `t`.`lastName`='ALLEGAERT ' . N2 ^5 t; P% z3 H9 `
  AND `t`.`dateOfBirth`='1971-07-29' 4 j+ Z  R( j5 D  K! _) M0 S6 b
  AND (userType NOT IN ("1"))
8 o5 c" O& N1 hLIMIT 1;
8 F9 z( `. h" Q2 L& t8 h. h* L/ \
$ s4 H* c# g7 L6 x- A# D需求INDEX(firstName, lastName, dateOfBirth); 字段可以是任何顺序(在这种情况下)。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则