J'ai besoin de vitesse spécifiques de requête mysql sur une grande table
Salut, je sais qu'il ya beaucoup de sujets dédiés à la requête de l'optimisation de stratégies, mais c'est tellement spécifique que je ne pourrais pas trouver la réponse, n'importe où sur la interenet.
J'ai une grande table de produit dans la boutique en ligne (appx. 180k lignes), et le tableau a 65 colonnes. Ouais ouais je sais sa fait beaucoup, mais j'y stocker des informations sur les livres, les dvd, les bluerays et jeux.
Encore je suis pas tenu compte de beaucoup de cols dans la requête, mais la sélection est toujours assez délicat. Il y a beaucoup de conditions qui doivent être examinées et comparées. La requête ci-dessous
SELECT *
FROM products
WHERE production = 1
AND publish_on < '2012-10-23 11:10:06'
AND publish_off > '2012-10-23 11:10:06'
AND price_vat > '0.5'
AND ean <> ''
AND publisher LIKE '%Johnny Cash%'
ORDER BY bought DESC, datec DESC, quantity_storage1 DESC, quantity_storege2 DESC, quantity_storage3 DESC
LIMIT 0, 20
J'ai déjà essayé d'y mettre des indices un par un sur les cols dans la clause where et même dans la clause order by, puis j'ai essayé de créer des index composé (production, publish_on, publish_off, price_vat, ean).
Requête est toujours lent (quelques secondes) et il faut être rapide depuis sa boutique en ligne, solution, et les gens quittent car ils ne reçoivent pas leurs résultats rapides. Et je ne suis toujours pas compter le temps j'ai besoin pour effectuer la recherche pour tous trouvé lignes pour que je puisse faire de la pagination.
Je veux dire, la meilleure façon de faire rapide est de simplifier la requête, mais toutes les conditions et que le tri est un must dans ce cas.
N'importe qui peut aider avec ce genre de problème? Est-il même possible de la vitesse de ce type de requête, ou est-il une autre façon de comment je peux par exemple simplifier la requête et de laisser le reste sur le moteur php pour trier les résultats..
Oh, Iam vraiment paumé dans ce.. Partager votre sagesse peple, s'il vous plaît...
Merci beaucoup à l'avance
et exécuter une expliquer à voir ce qui se passe
merci de poster le schéma de la table. Il est possible que vous avez un set-up qui pourraient bénéficier de déplacement de colonnes à des tables séparées. Deuxièmement, s'il vous plaît poster le
EXPLAIN
requête.Vous avez 3 gamme de conditions et une comparaison de chaîne qui commence avec un générique et un
ORDER BY
clause. Il n'est pas surprenant que votre requête n'est pas rapide.Vous pouvez aussi jeter un oeil sur: ajaxline.com/32-tips-to-speed-up-your-mysql-queries
OriginalL'auteur user1768510 | 2012-10-24
Vous devez vous connecter pour publier un commentaire.
Tout d'abord être sûr de ce que vous voulez sélectionner et effacer le '*'
avec quelque chose de plus spécifique
Il n'y a pas de Joindre ou quoi que ce soit d'autres dans votre table de sorte que la vitesse des options sont assez petites, je pense.
Vérifier que votre Serveur mysql peut utiliser assez de mémoire.
Jetez un oeil à cette confis dans votre mon.cnf
Ont un look un max a permis de simultanéité. mysql recommande CPU*2
thread_concurrency = 4
Vous devriez vraiment pense fractionnement de la table en fonction des informations que vous utilisez et sur la norme de normalisation. Si cela est possible.
Si c'est un système de production ne disposant d'aucun moyen pour diviser les tables alors pensez à un serveur de mise en cache. Mais cela ne vous aidera que si vous avez beaucoup de périodique des requêtes sur qui sont les mêmes.
C'est ce que je ferais quand il ne sait rien à propos de l'implémentation sous-jacente ou le système à tous.
Edit:
Faire autant de colonnes indexées comme vous pouvez vous n'aurez pas nécessairement la vitesse de votre système. Le plus d'indices ≠ le plus de vitesse.
OriginalL'auteur cb0
merci à vous tous pour la bonne remarques..
J'ai trouvé la solution sans doute parce que j'en ai été capable de réduire la durée des requêtes à partir de 2,8 s jusqu'à 0,3 sec.
SOLUTION:
à l'aide de
SELECT *
est vraiment naïf sur les grandes tables (65cols) donc, j'ai réalisé que je n'ai besoin que de 25 d'entre eux sur la page: autres peuvent être facilement utilisé sur la page produit lui-même.J'ai aussi réindexée ma table de peu. J'ai créé index composé sur
puis j'ai créé un autre spécialement pour la recherche, y compris les cols
dernière chose que ce que j'ai fait a été d'utiliser des requêtes comme
qui m'a permis de calculer influencé lignes plus rapide à l'aide de
après le mysql_query()... Cependant je ne peux pas comprendre comment il pourrait être plus rapide, car EXPLIQUER ÉTENDU dit que la requête n'est pas à l'aide d'un index, de son encore 0,5 s plus rapide, puis calculer le nombre de lignes d'une requête individuelle.
Il semble fonctionner assez bien. Si la clause order by n'était pas là, il serait mal rapide, mais c'est quelque chose que je n'ai aucune influence sur.
Encore besoin de vérifier mes paramètres du serveur...
Remercier y'all à tous pour votre aide..
OriginalL'auteur user1768510