2009-11-26 4 views
0

J'ai une table de base de données avec des dictionnaires chinois (environ 300 000 lignes) pour le dictionnaire en ligne. La structure de données ressemble à ceci:Recherche de base de données MySQL

ID  ch_smpl  pinyin  definition 
---------------------------------------- 
1  我   wǒ   I, me 
2  我们   wǒmen  we, us 
etc. 

Je ne suis pas bon avec php et mysql, donc la question est de savoir comment configurer un moteur de recherche? J'ai trouvé un tas de tutoriels sur la recherche php mysql, j'ai aussi trouvé quelques exemples de recherche en texte intégral, mais je ne suis pas sûr de savoir comment cela fonctionne avec les caractères chinois. La vitesse de la recherche est vraiment importante pour moi.

Toutes les suggestions sur la façon d'organiser le moteur de recherche à cet effet sont grandement appréciées.

Répondre

0

La vitesse de votre "moteur de recherche" dépend principalement de trois choses:

  1. Votre requête SQL
  2. Votre conception de base de données
  3. Votre configuration MySQL

Il y aura donc pas "retourner ce commutateur et vous obtiendrez des performances super duper". Vous aurez besoin de s'attaquer à tous ces domaines. En plus de cela, il y a beaucoup d'autres choses qui peuvent avoir un impact sur la performance. Par exemple: système d'exploitation, disque dur, quantité de mémoire, etc.

Commençons par la configuration de MySQL. Vous devriez d'abord essayer la fonction de mise en cache des requêtes mysql. Si vous avez principalement des opérations de lecture, cela peut augmenter vos performances car tout vient du cache et aucune opération d'E/S n'est nécessaire.

Lire ici: MySQL Documentation on Query Cache

Un autre domaine important est la conception de votre base de données ou moteur base de données que vous choisissez. Fondamentalement, vous avez trois options: InnoDB, MyIsam et Memory (il y en a d'autres mais je ne les connais pas vraiment). Pour autant que je sache, MyIsam et Memory supportent uniquement le verrouillage de la table et non le verrouillage des rangées. Mais encore une fois, si vous lisez principalement des opérations, cela ne vous affectera pas. En général, ils sont tous les deux plus rapides qu'InnoDB. Si j'étais toi, je commencerais par Memory puisque tout est en mémoire. Mais soyez conscient des implications: vous aurez peut-être besoin de plus de mémoire et vous perdrez des données non sauvegardées si le serveur tombe en panne. En revanche, InnoDB vous donne beaucoup de sécurité des données et peut également être assez rapide si vous le configurez correctement. Malheureusement, c'est une zone étendue. Donc je ne vais pas tout couvrir. Une chose à faire est de définir innodb_buffer_pool_size à environ 80% de votre mémoire. Donc, si vous avez 10 Go de RAM, vous pouvez le définir à 8 Go.

Si votre serveur comporte plus de 8 processeurs, vous pouvez également définir innodb_thread_concurrency sur un nombre plus élevé. Vous devriez utiliser 2 * nombre de processeurs.

Si vous voulez en savoir plus sur les performances de MySQL, vous devriez prendre une tasse de café et lire ce blog: MySQL performance blog

Une autre chose importante pourrait être d'utiliser des indices sur certaines de vos colonnes. Mais je ne peux pas vraiment dire si cela sera payant dans votre cas puisque ma connaissance du dictionnaire chinois est limitée;)

D'une manière générale votre champ de clé primaire devrait avoir un index. En plus de cela, vous pouvez utiliser des index pour les champs que vous interrogez souvent et qui changent rarement (chaque changement sur un champ d'index invalide l'index de sorte qu'il doit être recompilé -> problème de performance).Pour autant que je sache, il ne devrait être utilisé que dans le cas où la colonne contient beaucoup de données différentes. Si vous avez par exemple une colonne "genre" qui ne contient que "male" ou "female", vous ne casserez probablement que l'arbre d'index en deux. Si vous avez 100 utilisateurs, vous finirez avec 50 lignes. Mais si vous utilisiez un index pour leur numéro de téléphone, qui est dans la plupart des cas unique, vous obtiendrez une seule ligne, ce qui est beaucoup plus efficace.

Alors peut-être vous devriez utiliser un index pour la colonne ch_smpl.

Enfin et surtout votre requête. Mon premier conseil est de sélectionner le moins de données possible. Cela signifie éviter les requêtes comme ceci:

select * from ... 

Dans votre cas: Si vous voulez seulement avoir la définition pour vous 我 devez utiliser cette requête:

select definition from dictionary where ch_smpl = '我' 

et non

select * from dictionary where ch_smpl = '我' 

Evitez également "Like" - les déclarations avec le symbole de pourcentage devant le searchterm car cela désactivera l'index pour cette colonne.

Par exemple:

select * from dictionary where ch_smpl like '%我' 

Vous devez utiliser le symbole pour cent seulement après le terme:

select * from dictionary where ch_smpl like '我%' 

Un dernier conseil. Il n'y a pas d'interrupteur spécial que vous pouvez inverser comme je l'ai déjà dit. Il y a beaucoup de choses que vous pouvez faire pour obtenir de meilleures performances. Essayez quelques petites choses et mesurez la performance.

Questions connexes