Question

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

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

Je ne suis pas bon avec php et mysql, la question est donc de savoir comment configurer un moteur de recherche? J'ai trouvé un tas de tutoriels sur la recherche php mysql, j'ai aussi trouvé des 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 rapidité de la recherche est très importante pour moi.

Toutes les suggestions sur la manière d'organiser le moteur de recherche à cette fin sont les bienvenues.

Était-ce utile?

La solution

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

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

Donc, il n'y aura pas de "basculement de ce commutateur et vous obtiendrez des performances incroyables". Vous devrez vous attaquer à tous ces domaines. En plus de cela, de nombreux autres facteurs peuvent avoir une incidence sur les performances. 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 fonctionnalité de mise en cache de requête mysql. Si vous avez principalement lu des opérations, cela peut augmenter vos performances puisque tout provient du cache et qu’aucune opération d’entrée / sortie n’est nécessaire.

À lire ici: Documentation de MySQL sur le cache de requêtes

Un autre domaine important est la conception de votre base de données ou le moteur de base de données que vous choisissez. En gros, vous avez trois options: InnoDB, MyIsam et Memory (il y en a d'autres mais je ne les connais pas vraiment).

Autant que je sache, MyIsam et Memory ne prennent en charge que le verrouillage de table et non le verrouillage de ligne. Mais encore une fois, si vous faites principalement des opérations de lecture, cela ne vous affectera pas. En général, ils sont plus rapides qu'InnoDB. Si j'étais vous, je commencerais par la mémoire 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.

D'autre part, InnoDB vous offre beaucoup de sécurité des données et peut également être assez rapide si vous le configurez correctement. Malheureusement, c'est un vaste domaine. Donc, je ne couvrirai pas tout. Une chose à commencer 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 régler à 8 Go.

Si votre serveur compte plus de 8 processeurs, vous pouvez également définir le paramètre innodb_thread_concurrency sur un nombre plus élevé. Vous devez utiliser 2 * Nombre de processeurs.

Si vous souhaitez en savoir plus sur les performances de MySQL, prenez une tasse de café et lisez ce blog: blog sur les performances de MySQL

Une autre chose importante pourrait être d’utiliser des index sur certaines de vos colonnes. Mais je ne peux pas vraiment dire si cela vous rapportera dans la mesure où ma connaissance du dictionnaire chinois est limitée;)

De manière générale, votre champ de clé primaire devrait avoir un index. De plus, vous pouvez utiliser des index pour les champs que vous interrogez souvent et qui changent rarement (chaque modification d'un champ d'index invalide l'index, il doit donc être recompilé - & problème de performances).

Autant que je sache, il ne devrait également ê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 détient que "mâle" ou " femme " vous ne couperez probablement que de moitié l’arbre d’index. Si vous avez 100 utilisateurs, vous obtiendrez 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 n’auriez qu’une seule ligne, ce qui est beaucoup plus efficace.

Vous devriez donc peut-être utiliser un index pour la colonne ch_smpl .

Dernier point, mais non le moindre, votre requête. Mon premier conseil est de sélectionner le moins de données possible. Cela signifie éviter les requêtes comme celle-ci:

select * from ...

Dans votre cas: si vous souhaitez uniquement avoir la définition de & # 25105; vous devriez utiliser cette requête:

select definition from dictionary where ch_smpl = '我'

et non

select * from dictionary where ch_smpl = '我'

Evitez également les énoncés "Comme" et les témoins-avec le symbole de pourcentage devant le moteur de recherche, car cela désactive l'index pour cette colonne.

Par exemple:

select * from dictionary where ch_smpl like '%我'

Vous devez utiliser le symbole de pourcentage uniquement 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 retourner comme je l'ai dit auparavant. Il y a beaucoup de choses que vous pouvez faire pour atteindre de meilleures performances. Essayez quelques solutions et mesurez les performances.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top