2010-09-03 11 views
0

Salut c'est ma structure de tableGrande table MySQL Mise à jour lente

CREATE TABLE IF NOT EXISTS `sms_report` (
`R_id` int(11) NOT NULL auto_increment, 
`R_uid` int(11) NOT NULL, 
`R_smppid` varchar(100) collate utf8_unicode_ci NOT NULL, 
`R_from` varchar(10) collate utf8_unicode_ci NOT NULL, 
`R_status` longtext collate utf8_unicode_ci NOT NULL, 
`R_message` text collate utf8_unicode_ci NOT NULL, 
`R_numbers` longtext collate utf8_unicode_ci NOT NULL, 
`R_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, 
`R_timedate` varchar(40) collate utf8_unicode_ci NOT NULL, 
`R_show` int(11) NOT NULL default '1', 
`oldformat` tinyint(1) NOT NULL default '0', 
PRIMARY KEY (`R_id`) 

) MOTEUR = MyISAM DEFAULT charset = utf8 COLLATE = utf8_unicode_ci AUTO_INCREMENT = 1947722; J'ai environ 2 millions de lignes alors quand je fais une mise à jour sur R_status ici, cela semble prendre trop de temps (R_status est soit 1,2,16 soit 24). S'il vous plaît suggérer sur la façon d'optimiser.

+0

La mise à jour est-elle basée uniquement sur 'R_id' dans la clause' WHERE'? ou d'autres colonnes? pouvez-vous poster un exemple de requête 'UPDATE'? – aularon

+0

exemple de requête de mise à jour serait mise à jour sms_report définir R_status = 1 où R_smppid = 738sbdasdbajsdbdfbfbks782 | 9898773122 –

Répondre

0

Comme @BarsMonster suggestd, convertir R_status en un nombre entier (TINYINT si les valeurs ne sont 1,2,16,24), et de créer un INDEX sur R_smppid. En outre, si R_smppid est largeur fixe, modifiez le type de champ à char(40) ou quelle que soit la longueur du contenu, ou s'il peut être converti en nombre entier, c'est encore mieux.

+0

Qu'est-ce qu'un index? –

+0

Lorsque vous créez un index, le moteur de base de données met en cache une version du champ ordonnée pour une recherche simple et rapide sur demande. Lorsque vous faites UPDATE .. WHERE indexed_field = valeur' la fois suivante, la base de données trouve cette ligne beaucoup plus rapidement. Regardez-le ici: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html – aularon

3

Si R_status est toujours un entier, le rendre entier. Aussi, je voudrais essayer de convertir cette table en format de largeur de ligne fixe (pas de varchars/textes)

De même, faites l'index sur R_smppid, sans cela il ferait l'analyse de table complète sur chaque mise à jour.