2017-08-22 2 views
2

J'ai une table dans mysql avec plus de 80M dossiers. Dans le moteur MYISAM.Requête lente lors de l'utilisation de l'ordre avec limite 1

Quand je lance cette requête

SELECT id FROM mytable WHERE (key1=-5) AND key2=467476 ORDER BY id DESC LIMIT 1 

requête est lente et après 5 minutes je dois tuer requête pour libérer la table.

Mais quand je simplement augmenter la taille limite ce travail de recherche avec succès dans 44ms

Par exemple (j'augmente simplement la taille limite):

SELECT id FROM mytable WHERE (key1=-5) AND key2=467476 ORDER BY id DESC LIMIT 2 

Maintenant, pour résoudre ce problème que je tente la requête suivante et ce travailler avec succès (ce qui est une solution temporaire)

SELECT id FROM (SELECT id FROM mytable WHERE (key1=-5) AND key2=467476 ORDER BY id DESC LIMIT 2) AS tbl ORDER BY id DESC LIMIT 1 

note : id est pr imary et auto increment!

Mise à jour:

key1 ==> folder_id

key2 ==> userid

CREATE TABLE `bm60_mails` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `userid` int(11) NOT NULL DEFAULT '0', 
    `betreff` varchar(255) CHARACTER SET utf8 NOT NULL, 
    `von` varchar(255) CHARACTER SET utf8 NOT NULL, 
    `an` varchar(255) CHARACTER SET utf8 NOT NULL, 
    `cc` varchar(255) CHARACTER SET utf8 NOT NULL, 
    `body` longtext NOT NULL, 
    `folder` int(11) NOT NULL, 
    `datum` int(11) NOT NULL DEFAULT '0', 
    `trashstamp` int(11) NOT NULL, 
    `priority` enum('low','normal','high') NOT NULL, 
    `fetched` int(11) NOT NULL DEFAULT '0', 
    `msg_id` varchar(128) CHARACTER SET utf8 NOT NULL, 
    `virnam` varchar(128) CHARACTER SET utf8 NOT NULL, 
    `trained` tinyint(4) NOT NULL DEFAULT '0', 
    `refs` text CHARACTER SET utf8 NOT NULL, 
    `flags` int(11) NOT NULL DEFAULT '-1', 
    `size` int(11) NOT NULL, 
    `color` tinyint(4) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `mailUser` (`userid`), 
    KEY `mailFlags` (`flags`), 
    KEY `mailFolder` (`folder`) 
) ENGINE=MyISAM AUTO_INCREMENT=95953499 DEFAULT CHARSET=latin1 
+1

Est-ce que 'key1' et' key2' sont indexés? – sagi

+1

Je ne suis pas sûr du problème 'LIMIT', peut-être' LIMIT 1' nécessite que la table entière soit triée, alors qu'un nombre plus élevé pourrait être un tri partiel. Question: Avez-vous des indices sur key1 ou key2? Nous pouvons peut-être accélérer votre requête, quelle qu'elle soit. –

+1

Veuillez soumettre une explication des deux requêtes. C'est plutôt intéressant. –

Répondre

1

Je soupçonne que si vous créez un index composé sur (key1, key2, id) votre problème disparaître.

La colonne id est également incluse car elle n'est pas implicite dans les tables MyISAM, bien que ce soit dans les tables InnoDB.

+0

La question demeure toujours, pourquoi est-ce que l'optimiseur se comporte comme ça? Intéressant .. – sagi

+0

@sagi sans informations supplémentaires sur la structure et expliquer que nous ne pouvons que suggérer comme 0.Jones dit. Cela pourrait avoir plusieurs raisons, c'est pourquoi nous ne pouvons que faire des suggestions. Mais d'après mon expérience, l'ordre par et quelques autres ne sont pas la meilleure solution pour les requêtes de performance. – Noob

+0

L'ajout d'index est très lent et si je veux ajouter de nouveaux index après deux jours, mysql est écrasé! –