2010-12-10 6 views
2

J'ai cherché une solution pour cela, mais hélas, nothind.MYSQL grande LIMIT offset

Actuellement, ma table pousse 5 800 000 lignes, à partir de 5000 sources différentes. Par exemple:

CREATE TABLE stores(
    store_id INT UNSIGNED PRIMARY_KEY AUTO_INCREMENT, 
    name VARCHAR(255) 
); 

CREATE TABLE articles(
    article_id INT UNSIGNED PRIMARY_KEY AUTO_INCREMENT 
    article_name CHAR(80), 
    article_price INT UNSIGNED, 
    store_id INT UNSIGNED 
); 

Ok, donc je l'ai fait des index comme ceci:

CREATE INDEX article ON articles(store_id,name); 

Et je pensais que je l'ai fait pare-balles, pas deviner.

Lorsque je recherche grands ensembles de données, 200 000 articles, im émission:

SELECT article_name, 
     article_price 
    FROM articles 
    WHERE store_id = $id 
ORDER BY article_name 
    LIMIT 100000,20; 

et obtenir de très grands temps de réponse. Aidez-moi, s'il vous plaît? : S

Répondre

0

Avez-vous essayé deux indices distincts sur store_id et article_name? Cela peut permettre un filtrage et une commande plus efficaces par MySQL. Vous pouvez également envisager de déplacer cette requête dans une procédure stockée afin que MySQL puisse mettre en cache les ensembles d'exécution/sous-résultat. Si rien de tout cela ne fonctionne, vous pouvez envisager le nombre d'opérations d'insertion/mise à jour/suppression qui se produisent sur cette table. Si elles sont élevées, vous pouvez envisager une réplication vers une base de données esclave où toutes les opérations de lecture se produisent. Si rien de tout cela ne fonctionne, vous voudrez peut-être mettre à jour votre matériel car MySQL devrait être capable de gérer des tables de cette taille assez facilement.

+0

Fondamentalement, cette table est bomarded toute la journée. 24/7 j'ai des insertions et des mises à jour. J'ai un index global sur article_name, pas sur store_id. Je ne pense pas qu'un index séparé sur id ferait n'importe quoi. J'utilise la table myisam, est-ce une bonne idée car elle utilise le verrou de la table, est-ce que ça gâche ma performance? Je répète, la table est constamment mise à jour et a beaucoup de nombreux inserts par jour. EDIT: j'ai requête lente activée, ce qui est ce que je reçois # Query_time: 7 Lock_time: 0 Rows_sent: 24 Rows_examined: 8224 BTW, la boîte est VPS avec xeon E5520, mais j'ai seulement 2 cores cpu et 3 Go de RAM. – Rob

1

Oui, bien je me suis dit dehors, comme personne d'autre ne me aider: D

L'idée est la suivante, quand je reguest une page I procédez comme suit:

CREATE TEMPORAIRE résultat TABLE (row_id, article_id); SET @row: = 0; INSERT INTO résultat SELECT @row: = (@ row + 1), article_id FROM articles ORDER BY $ sort $ order;

et simple SELECT/JOIN:

SELECT * FROM résultat LEFT JOIN articles sur result.article_id = articles.article_id OÙ row_id> = $ de ET row_id < $ à;

Bravo ...

+0

Cela fonctionne-t-il toujours pour vous à partir de l'aperçu des performances? Pouvez-vous fournir plus de détails sur votre environnement? –