2009-02-13 6 views

Répondre

2

Sans l'utilisation d'un index, une base de données doit effectuer une "analyse de table complète". C'est un peu comme si vous parcouriez un livre une page à la fois pour trouver ce dont vous avez besoin.

Cela étant dit, les ordinateurs sont beaucoup plus rapides que les humains. Cela dépend vraiment de la charge de votre système. Grâce à MySQL, nous avons implémenté avec succès un système de recherche sur une table d'informations. La nature du problème était celle qui ne pouvait pas être résolue par les index normaux (y compris le texte intégral). Nous avons donc conçu pour être alimenté en utilisant un balayage de table complet. Cela impliquait de créer des tables aussi étroites que possible avec les données de recherche, et de les joindre à une table plus grande avec des données connexes, mais sans recherche.

À l'époque (il y a 4 ans), 100 000 enregistrements pouvaient être analysés en 0,06 secondes. 1 000 000 d'enregistrements ont pris environ 0,6 seconde. Le système est toujours utilisé en production intensive avec des millions d'enregistrements.

Si vos données doivent dépasser 6 chiffres, vous pouvez réévaluer en utilisant un index de texte intégral ou faire des recherches sur les index inversés.

S'il vous plaît commenter si vous souhaitez plus d'informations.


Edit: Les tables de recherche ont été maintenus aussi étroite que possible. Idéalement 50-100 octets par enregistrement. ENUMS et TINYINT sont d'excellents économiseurs d'espace si vous pouvez les utiliser pour "mapper" les valeurs de chaîne d'une autre manière.

Les requêtes de recherche ont été générées en utilisant une classe PHP. Ils étaient tout simplement:

-- DataTable is the big table that holds all of the data 
-- SearchTable is the narrow table that holds the bits of searchable data 

SELECT 
    MainTable.ID, 
    MainTable.Name, 
    MainTable.Whatever 
FROM 
    MainTable, SearchTable 
WHERE 
    MainTable.ID = SearchTable.ID 
    AND SearchTable.State IN ('PA', 'DE') 
    AND SearchTable.Age < 40 
    AND SearchTable.Status = 3 

Essentiellement, les deux tables ont été rejoints sur une clé primaire (rapide) et le filtrage a été fait par analyse complète de table sur la SearchTable (assez rapide). Nous utilisions MySQL.

Nous avons constaté qu'en ayant le format d'enregistrement == "FIXED" dans les tables MyISAM, nous pouvions augmenter la performance de 3x. Cela signifie pas de blobs, pas de varchars, etc ...

Faites-moi savoir si cela aide.

+0

Oui s'il vous plaît expliquer un peu plus pour moi. Ce n'était pas clair sur les tableaux étroits ou comment vous avez implémenté la recherche. – Robert

2

Aucun n'est aussi efficace que la recherche de texte intégral.

Fondamentalement, il se résume à avec comme dérivés et puisque les indices sont jetés loin dans la plupart des scénarios, il devient une question très cher.

1

Si vous utilisez JAVA ont à regarder Lucene

Si vous utilisez .net, vous pouvez jeter un oeil à Lucene.net, il réduira au minimum les appels à la base de données pour les requêtes de recherche.

Après de http://incubator.apache.org/lucene.net/

Lucene.Net est un code source, classe par classe, API-per-API et le port algorithmatic du moteur de recherche Lucene Java à C# et .NET plate-forme utilisant Microsoft .NET Framework. Lucene.Net adhère aux API et classes utilisées dans l'implémentation Java d'origine de Lucene. Les noms d'API ainsi que les noms de classe sont conservés avec l'intention de donner à Lucene.Net l'aspect et la convivialité du langage C# et du .NET Framework. Pour l'exemple , la méthode Hits.length() dans l'implémentation Java lit maintenant Hits.Length() dans le port C#.

En plus des API et des classes port à C#, l'algorithme de Java Lucene est porté sur C# Lucene. Ce signifie un index créé avec Java Lucene est compatible avec les va-et-vient avec le C# Lucene; les deux à la lecture, écriture et mise à jour. En fait, un index Lucene peut être recherché simultanément et mis à jour en utilisant Java Lucene et C# Processus Lucene.

+0

Vous ne devez pas être limité à la machine virtuelle Java pour tirer parti de Lucene - vous pouvez utiliser Solr qui est une enveloppe HTTP autour Lucene. J'ai eu un énorme succès avec Solr: http://lucene.apache.org/solr/ –

+0

C'est génial, je ne sais pas à propos de ça, merci cody! – renegadeMind

0

Vous pouvez diviser le texte en mots individuels, les coller dans une table distincte et l'utiliser pour trouver les ID PK qui contiennent tous les mots de votre phrase de recherche [c.-à-d. mais pas nécessairement dans le bon ordre], puis recherchez seulement ces lignes pour la phrase. Devrait éviter d'avoir à faire un scan de table à chaque fois.

S'il vous plaît demander si vous avez besoin de moi d'expliquer davantage

Questions connexes