2009-09-16 4 views
6

J'ai une longue lecture en cours d'exécution. Il est une course de cronjob une fois par jour, mais l'ensemble DB est verrouillé vers le bas quand il est en cours d'exécution:Pourquoi les lectures bloquent-elles les autres lectures dans MyISAM?

mysql> show full processlist; 
+--------+------+-----------+------+---------+------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Id  | User | Host  | db | Command | Time | State  | Info                                                                                                                                                                                                                                                                | 
+--------+------+-----------+------+---------+------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| 464971 | paul | localhost | paul | Sleep | 2264 |    | NULL                                                                                                                                                                                                                                                                | 
| 472177 | paul | localhost | paul | Sleep | 96 |    | NULL                                                                                                                                                                                                                                                                | 
| 479527 | paul | localhost | paul | Sleep | 1765 |    | NULL                                                                                                                                                                                                                                                                | 
| 479528 | paul | localhost | paul | Sleep | 1765 |    | NULL                                                                                                                                                                                                                                                                | 
| 479623 | paul | localhost | paul | Query | 83 | Locked  | SELECT `metaward_alias`.`id`, `metaward_alias`.`modified`, `metaward_alias`.`created`, `metaward_alias`.`string_id`, `metaward_alias`.`shortname`, `metaward_alias`.`remote_image`, `metaward_alias`.`image`, `metaward_alias`.`user_id`, `metaward_alias`.`type_id`, `metaward_alias`.`md5` FROM `metaward_alias` WHERE `metaward_alias`.`string_id` = 'http://profiles.us.playstation.com/playstation/psn/profiles/Kool_Aid_Dude27' ORDER BY `metaward_alias`.`modified` DESC                                                                                                                                             | 
| 479624 | paul | localhost | paul | Sleep | 82 |    | NULL                                                                                                                                                                                                                                                                | 
| 480057 | paul | localhost | paul | Query | 88 | Locked  | UPDATE `metaward_award` SET `modified` = '2009-09-16 02:12:37', `created` = '2009-09-08 12:06:44', `string_id` = 'isaw5t', `owner_id` = 1135, `name` = '50 online matches won', `description` = 'Aim to win 50 online matches. (ranked match)', `owner_points` = 50, `url` = 'http://live.xbox.com/en-US/profile/Achievements/ViewAchievementDetails.aspx?tid=%09%5d%3a%13%1f%5d%1fGt%06', `remote_image` = 'http://tiles.xbox.com/tiles/6G/dm/1oCLiGJhbC9CCxtyGy1TVkRBL2FjaC8wLzE2AAAAAOfn5-lJZ-Q=.jpg', `image` = 'award/isaw5t.png', `parent_award_id` = 115242, `slug` = '50-online-matches-won-1', `points` = 43.9 WHERE `metaward_award`.`id` = 116054                                                                                                  | 
| 480571 | paul | localhost | paul | Query | 84 | Locked  | SELECT `metaward_alias`.`id`, `metaward_alias`.`modified`, `metaward_alias`.`created`, `metaward_alias`.`string_id`, `metaward_alias`.`shortname`, `metaward_alias`.`remote_image`, `metaward_alias`.`image`, `metaward_alias`.`user_id`, `metaward_alias`.`type_id`, `metaward_alias`.`md5` FROM `metaward_alias` WHERE `metaward_alias`.`string_id` = 'http://live.xbox.com/en-US/profile/profile.aspx?GamerTag=Hendricks' ORDER BY `metaward_alias`.`modified` DESC                                                                                                                                               | 
| 480578 | paul | localhost | paul | Query | 86 | Locked  | UPDATE `metaward_alias` SET `modified` = '2009-09-16 02:12:38', `created` = '2009-09-09 01:21:08', `string_id` = 'http://live.xbox.com/en-US/profile/profile.aspx?GamerTag=jobbie%20man', `shortname` = 'jobbie man', `remote_image` = 'http://avatar.xboxlive.com/avatar/jobbie%20man/avatarpic-l.png', `image` = 'alias/2ec3d391a311be936d9603f99dcfa353.png', `user_id` = NULL, `type_id` = 1135, `md5` = '2ec3d391a311be936d9603f99dcfa353' WHERE `metaward_alias`.`id` = 705419                                                                                                                                            | 
| 480579 | paul | localhost | paul | Query | 88 | Locked  | SELECT `metaward_award`.`id`, `metaward_award`.`modified`, `metaward_award`.`created`, `metaward_award`.`string_id`, `metaward_award`.`owner_id`, `metaward_award`.`name`, `metaward_award`.`description`, `metaward_award`.`owner_points`, `metaward_award`.`url`, `metaward_award`.`remote_image`, `metaward_award`.`image`, `metaward_award`.`parent_award_id`, `metaward_award`.`slug`, `metaward_award`.`points`, T3.`id`, T3.`modified`, T3.`created`, T3.`string_id`, T3.`owner_id`, T3.`name`, T3.`description`, T3.`owner_points`, T3.`url`, T3.`remote_image`, T3.`image`, T3.`parent_award_id`, T3.`slug`, T3.`points` FROM `metaward_award` LEFT OUTER JOIN `metaward_award` T3 ON (`metaward_award`.`parent_award_id` = T3.`id`) WHERE (`metaward_award`.`owner_id` = 1135 AND `metaward_award`.`owner_points` = 20 AND `metaward_award`.`name` = 'Marksman: Campaign' AND `metaward_award`.`parent_award_id` = 27034 AND `metaward_award`.`description` = 'Kill 4 enemies with one clip of a sniper rifle.') ORDER BY `metaward_award`.`modified` DESC | 
| 480580 | paul | localhost | paul | Query | 88 | Locked  | SELECT `metaward_award`.`id`, `metaward_award`.`modified`, `metaward_award`.`created`, `metaward_award`.`string_id`, `metaward_award`.`owner_id`, `metaward_award`.`name`, `metaward_award`.`description`, `metaward_award`.`owner_points`, `metaward_award`.`url`, `metaward_award`.`remote_image`, `metaward_award`.`image`, `metaward_award`.`parent_award_id`, `metaward_award`.`slug`, `metaward_award`.`points`, T3.`id`, T3.`modified`, T3.`created`, T3.`string_id`, T3.`owner_id`, T3.`name`, T3.`description`, T3.`owner_points`, T3.`url`, T3.`remote_image`, T3.`image`, T3.`parent_award_id`, T3.`slug`, T3.`points` FROM `metaward_award` LEFT OUTER JOIN `metaward_award` T3 ON (`metaward_award`.`parent_award_id` = T3.`id`) WHERE (`metaward_award`.`owner_id` = 1135 AND `metaward_award`.`owner_points` = 5 AND `metaward_award`.`name` = 'Headshot Honcho' AND `metaward_award`.`parent_award_id` = 101442 AND `metaward_award`.`description` = 'Kill 10 enemies with headshots in a ranked free for all playlist or in campaign.') ORDER BY `metaward_award`.`modified` DESC | 
| 480581 | paul | localhost | paul | Query | 86 | Locked  | SELECT `metaward_alias`.`id`, `metaward_alias`.`modified`, `metaward_alias`.`created`, `metaward_alias`.`string_id`, `metaward_alias`.`shortname`, `metaward_alias`.`remote_image`, `metaward_alias`.`image`, `metaward_alias`.`user_id`, `metaward_alias`.`type_id`, `metaward_alias`.`md5` FROM `metaward_alias` WHERE `metaward_alias`.`string_id` = 'http://www.wowarmory.com/character-sheet.xml?r=Aegwynn&cn=Fantazamor' ORDER BY `metaward_alias`.`modified` DESC                                                                                                                                              | 
| 480626 | paul | localhost | paul | Query | 88 | Sending data | SELECT COUNT(*) FROM `metaward_alias` INNER JOIN `metaward_achiever` ON (`metaward_alias`.`id` = `metaward_achiever`.`alias_id`) INNER JOIN `metaward_award` ON (`metaward_achiever`.`award_id` = `metaward_award`.`id`) WHERE `metaward_award`.`owner_id` = 9                                                                                                                                                                                                 | 
| 480630 | paul | localhost | paul | Query | 71 | Locked  | SELECT `metaward_alias`.`id`, `metaward_alias`.`modified`, `metaward_alias`.`created`, `metaward_alias`.`string_id`, `metaward_alias`.`shortname`, `metaward_alias`.`remote_image`, `metaward_alias`.`image`, `metaward_alias`.`user_id`, `metaward_alias`.`type_id`, `metaward_alias`.`md5`, T2.`id`, T2.`modified`, T2.`created`, T2.`string_id`, T2.`shortname`, T2.`remote_image`, T2.`image`, T2.`user_id`, T2.`type_id`, T2.`md5`, T3.`id`, T3.`modified`, T3.`created`, T3.`string_id`, T3.`shortname`, T3.`remote_image`, T3.`image`, T3.`user_id`, T3.`type_id`, T3.`md5`, T4.`id`, T4.`modified`, T4.`created`, T4.`string_id`, T4.`shortname`, T4.`remote_image`, T4.`image`, T4.`user_id`, T4.`type_id`, T4.`md5`, T5.`id`, T5.`modified`, T5.`created`, T5.`string_id`, T5.`shortname`, T5.`remote_image`, T5.`image`, T5.`user_id`, T5.`type_id`, T5.`md5`, T6.`id`, T6.`modified`, T6.`created`, T6.`string_id`, T6.`shortname`, T6.`remote_image`, T6.`image`, T6.`user_id`, T6.`type_id`, T6.`md5` FROM `metaward_alias` INNER JOIN `metaward_alias` T2 ON (`metaward_alias`.`type_id` = T2.`id`) INNER JOIN `metaward_alias` T3 ON (T2.`type_id` = T3.`id`) INNER JOIN `metaward_alias` T4 ON (T3.`type_id` = T4.`id`) INNER JOIN `metaward_alias` T5 ON (T4.`type_id` = T5.`id`) INNER JOIN `metaward_alias` T6 ON (T5.`type_id` = T6.`id`) WHERE `metaward_alias`.`string_id` = 'http://kongregate.com/accounts/SrGato' ORDER BY `metaward_alias`.`modified` DESC | 
| 480632 | paul | localhost | paul | Query | 0 | NULL   | show full processlist                                                                                                                                                                                                                                                           | 
+--------+------+-----------+------+---------+------+--------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
15 rows in set (0.00 sec) 

Je peux comprendre les mises à jour sont verrouillés, mais pourquoi Selects verrouillé aussi?

+0

niveau de la table-verrouillage est l'une des nombreuses raisons de ne pas d'utiliser MyISAM. – bobince

+0

J'ai essayé de convertir en InooDB et mon site a ralenti d'une tonne. http://stackoverflow.com/questions/1428678/is-innodb-sorting-really-that-slow –

Répondre

8

Toutes les sélections sont verrouillés parce qu'ils attendent votre mise à jour pour terminer, même si la mise à jour ne fonctionne pas encore

Je suppose que l'ordre de vos requêtes était:

  1. SELECT COUNT (*) DE ...
  2. MISE À JOUR metaward_award ...
  3. SELECT metaward_alias ...
  4. ...

query1 est en cours d'exécution .. il prend beaucoup de temps

query2 vient, veulent obtenir un verrou d'écriture, mais ne peux pas, parce qu'il ya une lecture, il attend et signal qu'il attend pour verrouiller

query3 vient, veut lire mais ne peut pas, parce que query2 signal déjà un verrou

maintenant vous direz ... MyISAM est lectures simultanées, query3 devrait lire pendant que query1 est en train de lire .. mais si c'était le cas, et query3 a pris longtemps temps aussi, vous pouvez faire "famine" sur query2, ce qui signifie qu'il ne sera jamais et exécutée si query1 & requete3 a pris beaucoup de temps et aller après l'autre, par exemple:

en supposant query1, requete3 prend 5 secondes pour exec

second | action 
1 | query1 starting 
2 | query2 cant start, waiting 
3 | query3 starting 
4 | 
5 | 
6 | qurey1 finished (query2 cant start because query3 is still reading) 
7 | another call for query1 starting 
8 | qurey3 finished (query2 cant start because the new query1 is still reading) 
+0

vous pouvez améliorer vos performances ici en exécutant un esclave et en exécutant vos requêtes de longue durée là-bas. – longneck

5

Vous pouvez utiliser l'option de serveur --low-priorisation mises à jour pour donner priorité aux instructions SELECT sur les opérations de modification de table (INSERT, REPLACE, DELETE et UPDATE)

Vous pouvez également utiliser le modificateur LOW_PRIORITY après votre instruction (par ex. MISE À JOUR LOW_PRIORITY)

Edit: il y a plus d'informations ici: http://dev.mysql.com/doc/refman/5.0/en/table-locking.html

+0

Puis-je faire en sorte que mon grand SELECT long ne soit pas prioritaire? –

+0

LOW PRIORITY pour SELECT n'a pas beaucoup de sens. Une fois qu'un SELECT long commence, il va encore prendre beaucoup de temps. qu'est-ce que cela prendrait un siège arrière? – longneck

+0

L'OP a un problème, comme expliqué dans la réponse acceptée, où la mise à jour qui attend la fin de la sélection bloque le démarrage de toutes les autres sélections. La définition de l'option '--low-priority-updates' dans le fichier my.cnf remettrait à plus tard toutes les opérations de mise à jour à l'arrière de la file et les sélections en attente seraient autorisées à démarrer. –

Questions connexes