2010-10-28 5 views
11

J'ai remarqué qu'un de mes scripts est devenu très lent, puis j'ai réduit le problème: c'était une requête de mise à jour. La chose étrange est que la requête SELECT est très rapide. La table compte environ 600 000 entrées. Et oui, id est UNIQUE PRIMARY KEY. Voici quelques exemples:Requête UPDATE extrêmement lente

SELECT * FROM `tmp_pages_data` WHERE id = 19080 LIMIT 0 , 30 

Showing rows 0 - 0 (1 total, Query took 0.0004 sec) 

Et maintenant la requête de mise à jour:

UPDATE tmp_pages_data SET page_status = 1 WHERE id = 19080 

1 row(s) affected. (Query took 24.5968 sec) 

Comme vous pouvez le voir, la sélection est très rapide, mais la mise à jour est veery lent. Comment est-ce possible?

+0

S'il vous plaît ajouter la structure de votre schéma, et en particulier les indices. Ecrivez également la taille et le type du moteur d'index –

+0

Ok, voici à quoi ressemble la table: CREATE TABLE IF NOT EXISTS 'tmp_pages_data' ( ' id' int (10) unsigned NON NULL AUTO_INCREMENT, 'site_id' int (11) DEFAULT NULL, 'url' varchar (255) DEFAULT NULL, NULL ' date_added' datetime DEFAULT, 'page_status' tinyint (4) DEFAULT NULL, ' page_type' varchar (255) NULL DEFAULT, 'title_normal' varchar (255) DEFAULT NULL, 'cat_id' int (11) DEFAULT NULL, ' title_id' int (11) NULL DEFAULT, clé primaire ('id'), KEY' url' ('url') ) = MOTEUR MySAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 658002; – okaybmd

+0

Indices: PRIMARY (BTREE) unique: Oui emballé: Non \t Champ: id \t Cardinalité: 658001 Classement: A \t Null: Non; Index: url (BTREE) \t unique: Non \t emballé: Non \t terrain: url \t Cardinalité: 658001 \t Collation: A \t Null: OUI – okaybmd

Répondre

1

Oui, c'est très bizarre. La seule chose à laquelle je peux penser est que la table tmp_pages_data est verrouillée par une autre transaction, ou que la ligne id = 19080 est verrouillée par une autre transaction.

L'autre (chose improbable) est que vous avez un index sur page_status qui doit être mis à jour sur la phrase UPDATE, et que cette partie prend beaucoup de temps à s'exécuter.

+0

En fait, j'ai FAIT un index sur page_status, mais je l'ai enlevé – okaybmd

+0

Hm ... non, ce n'est pas la raison. Je pensais que l'index n'était peut-être pas «correctement» supprimé, mais ce n'est pas le cas. J'ai effectué un test: UPDATE tmp_pages_data SET cat_id = 1 O WH id = 19080 -> 1 ligne (s) affectée (s). (Query a pris 4.7825 sec) Donc encore beaucoup de temps (et il n'y a pas d'index sur cat_id et n'a jamais été un) – okaybmd

-1

Ok, c'est fait!

J'ai dû redémarrer Apache, maintenant cela fonctionne très bien (en fait, j'ai redémarré Ubuntu)!

UPDATE tmp_pages_data SET page_status =1 WHERE id =19080 

1 row(s) affected. (Query took 0.0004 sec) 

Merci à tous pour vos suggestions :)