Comment améliorer la vitesse de regroupement
P粉155832941
2023-09-05 10:24:40
<p>J'ai une grande table avec plus de 3 milliards de lignes et l'exécution de ma requête prend désormais 3 jours. </p>
<p>Voici ma requête : </p>
<pre class="brush:php;toolbar:false;">insérer dans les mots de fréquence (mot, fréquence, nom de fichier)
sélectionnez le mot, comptez (*) comme fréquence, max (nom de fichier)
de tous les motstemp
regrouper par mot</pre>
<p>Fondamentalement, ma requête consiste à regrouper par mot à partir de la table allwordstemp, et je veux connaître le <strong>filename</strong> lorsque la fréquence = 1, c'est pourquoi j'ai ajouté max(filename), car le nom de fichier doit être inclus dans la fonction d'agrégation, comme max. Si fréquence > 1, je n'ai pas non plus besoin de la valeur du nom de fichier.
Les deux tables ont 2 index sur le mot et le nom de fichier. </p>
<p>table allwordstemp (le nom de fichier est un fichier d'identification) : </p>
<pre class="brush:php;toolbar:false;">CREATE TABLE `allwordstemp` (
`mot` varchar(45) NULL PAR DÉFAUT,
`nom de fichier` int(11) NULL PAR DÉFAUT,
CLÉ `idx_allwordstemp_word` (`mot`),
CLÉ `idx_allwordstemp_filename` (`filename`)
) MOTEUR=InnoDB DEFAULT CHARSET=utf8;</pre>
<p>tableau de mots de fréquence :</p>
<pre class="brush:php;toolbar:false;">CREATE TABLE `fréquencemots` (
`mot` varchar(45) NULL PAR DÉFAUT,
`fréquence` int(11) NULL PAR DÉFAUT,
`nom de fichier` int(11) NULL PAR DÉFAUT,
CLÉ `idx_ Frequencywords_word` (`mot`),
CLÉ `idx_fréquencewords_fréquence` (`fréquence`),
CLÉ `idx_ Frequencywords_filename` (`filename`)
) MOTEUR=InnoDB DEFAULT CHARSET=utf8;</pre>
<p>Expliquer la sélection :</p>
<pre class="brush:php;toolbar:false;">+----+-------------+------------- -+----------------+-------+---------------+------- ---- ------------+---------+------+------------+--- ---- ---+-------------+
| id | select_type table | partitions | clé_possible | lignes |
+---------+--------+--------------+--------------- -+-- -----+---------------+----------------+-- -- -----+------+------------+--------------+--------------- -- +
| 1 | SIMPLE | allwordstemp | NULL | idx_allwordstemp_word |
+---------+--------+--------------+--------------- -+-- -----+---------------+----------------+-- -- -----+------+------------+--------------+--------------- -- +</pré>
<p>Comment puis-je accélérer ma requête ? </p>
Votre filtre semble être basé sur la fréquence, et non sur les mots ou les noms de fichiers. Je commencerais donc par indexer tous les mots par fréquence.
Ensuite, en supposant que la fréquence soit un nombre entier, j'ajouterais une clause WHERE comme celle-ci :
Ce qui précède vous donnera une liste de tous les mots qui n'apparaissent qu'une seule fois dans différents noms de fichiers.
J'espère que cela vous aidera, et bonne chance !