Maison > Article > base de données > Parlons de la façon dont l'index de texte intégral MySQL résout le problème des requêtes lentes, comme celles à correspondance floue.
Requête floue, telle que l'interrogation d'utilisateurs dont le nom contient "xiao", la manière courante d'écrire est comme "%xiao%", elle analysera toute la table dans MySQL, la quantité de données est petite et la totalité L'analyse des tables est également très rapide. À mesure que les données augmentent, elles ralentiront et ES sera très lourd. Cet article vous présentera la solution pour ralentir les requêtes à correspondance floue : l'index de texte intégral MySQL.
Besoin d'une correspondance floue pour interroger un mot
select * from t_phrase Where LOCATE('chang',phrase) = 0; ) > 0;
expliquez et jetez un œil au plan d'exécutionselect * from t_chinese_phrase which phrase like '%长%'
Il ressort des résultats d'explication que même si nous J'ai construit un index pour la phrase, mais lors de l'interrogation, l'index n'est pas valide.
Raison : L'index de MySQL est une structure arborescente B+. L'utilisation par InnoDB de "%xx" lors d'une requête floue de données entraînera l'échec de l'index (je n'entrerai pas dans les détails ici)
Du point de vue du temps de requête, le temps passé : 90 ms.Volume de données actuel : 93230 (9,3 W) nécessite déjà 90 ms. Ce temps n'est pas acceptable. Si la quantité de données augmente, ce temps continuera à augmenter.
Solution :
Lorsque la quantité de données n'est pas importante, utilisez l'index de texte intégral de MySQL ;
Lorsque la quantité de données est relativement importante ou que l'index de texte intégral de MySQL n'est pas à la hauteur des attentes, vous pouvez envisagez d'utiliser ESCe qui suit concerne principalement l'index de texte intégral MySQLIntroduction à l'index de texte intégral
Le moteur InnoDB sur MySQL5.6.24 a également ajouté l'indexation en texte intégral.
2. Index en texte intégral
create table 表名( 字段名1, 字段名2, 字段名3, 字段名4, FULLTEXT full_index_name (字段名) )ENGINE=InnoDB;
créez le nom de l'index de texte intégral sur le nom de la table (nom du champ) ;<p></p>par exemple :<p><pre class="brush:sql;toolbar:false">create table t_word
(
id int unsigned auto_increment comment &#39;自增id&#39; primary key,
uid char(32) not null comment &#39;32位唯一id&#39;,
word varchar(256) null comment &#39;英文单词&#39;,
translate varchar(256) null
);
create fulltext index full_idx_translate
on t_word (translate);
create fulltext index full_idx_word
on t_word (word);
INSERT INTO t_word (id, uid, word, translate) VALUES (1, &#39;9d592499c65648b0a9519206688ef3f9&#39;, &#39;lion&#39;, &#39;狮子&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (2, &#39;ce26ac4239514bc6af481bcb1d9b67df&#39;, &#39;panda&#39;, &#39;熊猫&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (3, &#39;a7d6042853c44904b68275daafb44702&#39;, &#39;tiger&#39;, &#39;老虎&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (4, &#39;f13bd0a8ecea44fc9ade1625eeb4cc3c&#39;, &#39;goat&#39;, &#39;山羊&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (5, &#39;27d5cbfc93a046388d712085e567474f&#39;, &#39;sheep&#39;, &#39;绵羊&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (6, &#39;ed35df138cf348aa937781be8ee21cbf&#39;, &#39;lamb&#39;, &#39;羊羔&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (7, &#39;fba5861d9527440990276e999f47ef8f&#39;, &#39;buffalo&#39;, &#39;水牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (8, &#39;3a72e76f210841b1939fff0d3d721375&#39;, &#39;bull&#39;, &#39;公牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (9, &#39;272e0b28ea7a48248a86f17533bf9943&#39;, &#39;cow&#39;, &#39;母牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (10, &#39;47127adface54e418e4c1b9980af6d16&#39;, &#39;calf&#39;, &#39;小牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (11, &#39;10592499c65648b0a9519206688ef3f9&#39;, &#39;little lion&#39;, &#39;小狮子&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (12, &#39;1bf095110b634a01bee5b31c5ee7ee0c&#39;, &#39;little cow&#39;, &#39;母牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (13, &#39;4813e588cde54c30bd65bfdbb243ad1f&#39;, &#39;little calf&#39;, &#39;小小牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (14, &#39;5e377e281ad344048b6938a638b78ccb&#39;, &#39;little bull&#39;, &#39;小公牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (15, &#39;2855ad0da2964c7682c178eb8271f13d&#39;, &#39;little buffalo&#39;, &#39;小水牛&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (16, &#39;72f24c9a77644d57a36f3bdf2b8116b0&#39;, &#39;little lamb&#39;, &#39;小羊羔&#39;);
INSERT INTO t_word (id, uid, word, translate) VALUES (17, &#39;2d592499c65648b0a9519206688ef3f9&#39;, &#39;I&#39;&#39;m a big lion&#39;, &#39;我是一只大狮子&#39;);</pre> </p>3. Supprimer l'index de texte intégral<p><code>create fulltext index 索引名称 on 表名(字段名);
eg:
MATCH(col1,col2,...) AGAINST(expr[search_modifier]) search_modifier: { IN NATURAL LANGUAGE MODE | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | IN BOOLEAN MODE | WITH QUERY EXPANSION }
3、删除全文索引
alter table 表名 drop index 索引名;
modifier le nom de la table supprimer le nom de l'index ;
par défaut
mode de recherche en texte intégral. Le mode langage naturel ne peut pas utiliser d'opérateurs et ne peut pas spécifier de requêtes complexes telles que des mots-clés qui doivent apparaître ou ne doivent pas apparaître.// 默认是使用 in natural language mode select * from t_word where match(word) against ('lion'); // 或者 显示写 select * from t_word where match(word) against ('lion' in natural language mode);Les résultats sont les suivants : 4.2 EN MODE BOOLÉENMode BOOLÉEN
Vous pouvez utiliser des opérateurs, qui peuvent prendre en charge des requêtes complexes telles que spécifier que les mots-clés doivent apparaître ou ne doivent pas apparaître ou si le le poids du mot-clé est élevé ou faible. Il est recommandé d'utiliser le mode booléen
Opérateur
est vide | |
---|---|
+ | inclure, ce mot doit exister. |
- | Exclusion, les mots ne doivent pas apparaître. |
>(supérieur au signe) | Incluez et augmentez la valeur de classement, les résultats de la requête seront plus élevés |
Incluez et réduisez la valeur de classement, les résultats de la requête seront inférieurs | |
() | Regroupez les mots en sous-expressions (leur permettant d'être inclus, exclus, classés, etc. en tant que groupe). |
~ | La valeur de classement des mots négatifs. |
* | Le joker est à la fin du mot. |
"" | Définissez une phrase (par opposition à une liste de mots individuels, où la phrase entière correspond pour inclure ou exclure). |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!