J'ai une table avec 3 colonnes et des millions de lignes. tous sont des entiers (hachages) id, attribute, attrib_val
Requête MySQL pour aller chercher n'importe quelle combinaison de n'existe pas/n'existe pas
id peut avoir plusieurs lignes avec des combinaisons de noms et de valeurs d'attribut.
La table a deux touches id, attribute, attrib_val attribute, attrib_val, id
J'ai besoin de construire dynamiquement, les requêtes qui peuvent atteindre ids basées sur des règles, par exemple:
ids dans lequel toutes sections ci-dessous doivent correspondre: attribute <x> contains value <y> or <t> attribute <l> does not contain value <f> or <c> ...
ids dans lesquels un des sections suivantes devrait correspondre: attribute <x> contains value <y> or <t> attribute <l> does not contain value <f> or <c> ...
Le problème: Ceci est la requête que je suis venu avec (je peux changer d'identifiant pas dans la ne contient pas de pièces et de modifier les ET à OU changer de ou à tout:
SELECT distinct id FROM attributes
WHERE id IN (
SELECT id FROM attributes
WHERE ((attribute = 12944489 AND attrib_value = 907348202)
)
AND id IN (
SELECT id FROM attributes
WHERE (
(attribute = 577513892 AND attrib_val = 519655334)
OR (attribute = 577513892 AND attrib_val = 1266247963)
)
)
)
Le problème est que cette requête n'est pas efficace. Pour une raison quelconque, Mysql balaye toutes les lignes de la table si je lance chaque sous-requête séparément, il contient quelques centaines de lignes.
Comment puis-je optimiser cette requête ou en trouver une alternative qui peut gérer les exigences flexibles efficacement. Notes: 1. Mysql 5.5.31 2. J'ai simplifié les requêtes pour une explication facile. en réalité, il existe une colonne sid globale supplémentaire et toutes les requêtes incluent sid = XXX dans chaque segment where.
avec des jointures est beaucoup plus efficace que d'utiliser des instructions select imbriquées. Je recommande de commencer là et de voir quelles améliorations vous obtenez. – Archer
N'utilisez pas 'IN (SELECT ...)', utilisez 'JOIN '. Un "auto-joint" dans ce cas. –