Comment améliorer la vitesse de regroupement
P粉155832941
P粉155832941 2023-09-05 10:24:40
0
1
559
<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>
P粉155832941
P粉155832941

répondre à tous(1)
P粉741678385

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 :

select word, max(filename)
from allwordstemp
where frequency = 1
group by word

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 !

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal