2010-08-16 7 views
4

Je dois vérifier si une valeur entière est déjà dans ma base de données (qui ne cesse de croître). Et cela devrait être fait plusieurs milliers de fois dans un script. Je considère deux alternatives:PHP in_array vs MySQL SELECT

  1. Lisez tous ces nombres de base de données MySQL dans le tableau PHP et chaque fois que j'ai besoin de le vérifier, utilisez la fonction in_array.
  2. Chaque fois que je dois vérifier le numéro, il suffit d'exécuter quelque chose comme numéro SELECT de table où le nombre = LIMIT « # » 1

D'une part, la recherche dans le tableau qui est stocké dans la RAM devrait être plus rapide que d'interroger mysql à chaque fois (comme je l'ai mentionné, ces vérifications sont effectuées environ un millier de fois lors de l'exécution d'un script). D'un autre côté, DB est en train de grandir, et ce réseau peut devenir très grand et cela peut ralentir les choses. La question est: quelle est la méthode la plus rapide ou la meilleure pour d'autres aspects?

+6

sont construits pour être interrogés et recherchés, et parfois ils sont également en mémoire cache. Les fonctions de tableau de PHP sont bonnes pour la recherche, mais elles ne correspondent pas à un moteur de base de données compilé. –

+0

Vous avez une limite de mémoire, donc tout mettre dans un tableau peut ne pas offrir une solution du tout. La mise en cache est la seule solution si vous parlez de grandes bases de données, mais vous devez d'abord définir la durée de fraîcheur acceptable des données. – stillstanding

+0

Quelle est la taille de cette table de base de données? 10 rangs? 1000 lignes? 1,000,000 lignes? 1,000,000,000 lignes? (La réponse à cela fera une énorme différence dans la stratégie optimale) ... Aussi, pouvez-vous "lot" ces numéros (donc au lieu de faire 3000 requêtes, seulement 30 avec chaque recherche de 100 numéros)? – ircmaxell

Répondre

1

Je dois convenir que # 2 est votre meilleur choix. Lors de l'exécution d'une requête avec un LIMIT 1, MySQL arrête la requête lorsqu'il trouve la première correspondance. Assurez-vous que les colonnes que vous avez l'intention de rechercher sont indexées.

0

Comment le nombre de fois que vous devez vérifier se compare-t-il au nombre de valeurs stockées dans la base de données? Si c'est 1: 100, il est probablement préférable de faire une recherche dans la base de données à chaque fois, si c'est (un peu) moins, le préchargement de la liste sera plus rapide. Qu'est-il arrivé quand vous l'avez testé?

Cependant, même si le taux est suffisamment bas pour accélérer le chargement de la table complète, la mémoire sera engloutie et, par conséquent, tout le reste fonctionnera plus lentement.

Je vous recommande donc de ne pas tout charger en mémoire. Mais si vous le pouvez, regroupez les chèques afin de minimiser le nombre d'allers-retours à la base de données.

C.

1

On dirait que vous dupliquez une contrainte unique dans le code ...

CREATE TABLE MyTable(
SomeUniqueValue INT NOT NULL 
CONSTRAINT MyUniqueKey UNIQUE (SomeUniqueValue)); 
+0

Non, je ne le fais pas. J'ai besoin de le vérifier dans mon algorithme. – Jaroslav

0

la base de données est d'interroger la meilleure option, un parce que vous avez dit la base de données est en croissance de sorte que des moyens de nouvelles valeurs sont ajoutées à la table, whereis dans in_array vous liriez les anciennes valeurs. Deuxièmement, vous pourriez épuiser la RAM alloué à PHP avec une très grande quantité de données. Troisièmement, mysql a ses propres optimiseurs de requête et d'autres optimisations qui en fait un bien meilleur choix par rapport aux bases de données php