`
Donald_Draper
  • 浏览: 984364 次
社区版块
存档分类
最新评论

mysql 全文索引

阅读更多
mysql大表查询的时候,'String%'模糊查询可以使用B+树类型的索引prefix,然而'String%'匹配模式在应用中不是我们所需要的,往往需要'%String%',这是我们可以考虑使用FULLTEXT索引,INNODE是以红黑树来,存储全文索引,下面我们就来测试一下全文索引。
首先建表:
CREATE TABLE fts_a(
FTS_DOC_ID BIGINT UNSIGNED AUTO_INCREMENT NOT NULL,
body TEXT,
PRIMARY KEY (FTS_DOC_ID)
);
插入记录:
INSERT INTO `test`.`fts_a` (`FTS_DOC_ID`, `body`) VALUES ('1', 'some one like you');
INSERT INTO `test`.`fts_a` (`FTS_DOC_ID`, `body`) VALUES ('2', 'you can you up');
INSERT INTO `test`.`fts_a` (`FTS_DOC_ID`, `body`) VALUES ('3', 'I like your style');
INSERT INTO `test`.`fts_a` (`FTS_DOC_ID`, `body`) VALUES ('4', 'one day ,i see you');
创建全文索引:
mysql> CREATE FULLTEXT INDEX idx_fts ON fts_a(body);
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0
查看索引:
mysql> show index from fts_a;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| fts_a |          0 | PRIMARY  |            1 | FTS_DOC_ID  | A         |           4 | NULL     | NULL   |      | BTREE      |         |               |
| fts_a |          1 | idx_fts  |            1 | body        | NULL      |           4 | NULL     | NULL   | YES  | FULLTEXT   |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set

设置索引参数:
mysql> SET GLOBAL innodb_ft_aux_table='test/fts_a';
Query OK, 0 rows affected
查看全文索引(倒排索引)信息:
mysql> select * from fts_a;
+------------+--------------------+
| FTS_DOC_ID | body               |
+------------+--------------------+
|          1 | some one like you  |
|          2 | you can you up     |
|          3 | I like your style  |
|          4 | one day ,i see you |
+------------+--------------------+
4 rows in set
mysql> select * from information_schema.INNODB_FT_INDEX_TABLE;
+-------+--------------+-------------+-----------+--------+----------+
| WORD  | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+-------+--------------+-------------+-----------+--------+----------+
| can   |            2 |           2 |         1 |      2 |        4 |
| day   |            4 |           4 |         1 |      4 |        4 |
| like  |            1 |           3 |         2 |      1 |        9 |
| like  |            1 |           3 |         2 |      3 |        2 |
| one   |            1 |           4 |         2 |      1 |        5 |
| one   |            1 |           4 |         2 |      4 |        0 |
| see   |            4 |           4 |         1 |      4 |       11 |
| some  |            1 |           1 |         1 |      1 |        0 |
| style |            3 |           3 |         1 |      3 |       12 |
| you   |            1 |           4 |         3 |      1 |       14 |
| you   |            1 |           4 |         3 |      2 |        0 |
| you   |            1 |           4 |         3 |      2 |        8 |
| you   |            1 |           4 |         3 |      4 |       15 |
| your  |            3 |           3 |         1 |      3 |        7 |
+-------+--------------+-------------+-----------+--------+----------+
14 rows in set
删除记录innodb并不会立即删除索引,要进行优化操作,测试如下
mysql> DELETE FROM fts_a WHERE fts_doc_id=4;
Query OK, 1 row affected

mysql> SELECT * FROM information_schema.INNODB_FT_DELETED;
+--------+
| DOC_ID |
+--------+
|      4 |
+--------+
1 row in set
优化:
mysql> SET GLOBAL innodb_optimize_fulltext_only=1;
Query OK, 0 rows affected

mysql> OPTIMIZE TABLE test.fts_a;
+------------+----------+----------+----------+
| Table      | Op       | Msg_type | Msg_text |
+------------+----------+----------+----------+
| test.fts_a | optimize | status   | OK       |
+------------+----------+----------+----------+
1 row in set

mysql> SELECT * FROM information_schema.INNODB_FT_DELETED;
+--------+
| DOC_ID |
+--------+
|      4 |
+--------+
1 row in set

mysql> SELECT * FROM information_schema.INNODB_FT_BEING_DELETED;
+--------+
| DOC_ID |
+--------+
|      4 |
+--------+
1 row in set
利用全文索引查询记录:
mysql> SELECT * FROM fts_a WHERE MATCH(body) AGAINST ('like' IN NATURAL LANGUAGE MODE);
+------------+-------------------+
| FTS_DOC_ID | body              |
+------------+-------------------+
|          1 | some one like you |
|          3 | I like your style |
+------------+-------------------+
2 rows in set
从查询解释我们可以看出使用个全文索引
mysql> EXPLAIN SELECT * FROM fts_a WHERE MATCH(body) AGAINST ('like' IN NATURAL LANGUAGE MODE);
+----+-------------+-------+----------+---------------+---------+---------+------+------+-------------+
| id | select_type | table | type     | possible_keys | key     | key_len | ref  | rows | Extra       |
+----+-------------+-------+----------+---------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | fts_a | fulltext | idx_fts       | idx_fts | 0       | NULL |    1 | Using where |
+----+-------------+-------+----------+---------------+---------+---------+------+------+-------------+
1 row in set
查询文档相关性
mysql>
SELECT FTS_DOC_ID,body,MATCH(body) AGAINST ('like' IN NATURAL LANGUAGE MODE) AS Relevance FROM fts_a ;
+------------+-------------------+--------------------+
| FTS_DOC_ID | body              | Relevance          |
+------------+-------------------+--------------------+
|          1 | some one like you | 0.0906190574169159 |
|          2 | you can you up    |                  0 |
|          3 | I like your style | 0.0906190574169159 |
|          5 | hell girls        |                  0 |
+------------+-------------------+--------------------+
4 rows in set
查询存在like和you的文档
mysql> SELECT * FROM fts_a WHERE MATCH(body) AGAINST ('+like +you' IN BOOLEAN MODE);
+------------+-------------------+
| FTS_DOC_ID | body              |
+------------+-------------------+
|          1 | some one like you |
+------------+-------------------+
1 row in set
查看一般匹配查询,并没有使用索引
mysql> EXPLAIN SELECT * FROM fts_a WHERE body LIKE '%like%';
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | fts_a | ALL  | NULL          | NULL | NULL    | NULL |    4 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+
1 row in set


分享到:
评论

相关推荐

    MySQL全文索引应用简明教程.pdf

    MySQL全文索引是一种高效检索文本数据的技术,尤其适用于大数据量的文本字段搜索。在MySQL中,全文索引主要应用于MyISAM和InnoDB两种表引擎,尽管MyISAM是传统选择,但自MySQL 5.6以后,InnoDB也开始支持全文索引。 ...

    MySQL全文索引应用简明教程[参考].pdf

    MySQL全文索引是一种高效检索文本数据的机制,尤其适用于大数据量的文本检索场景。全文索引在MySQL中主要用于提升对长文本字段的搜索性能,它能够理解查询字符串中的语义,找出与之最相关的记录。在MySQL 5.6之前,...

    MySQL全文索引、联合索引、like查询、json查询速度哪个快

    首先,全文索引(Full-text Index)是MySQL提供的一种特殊类型的索引,专门用于提高全文搜索的性能。全文索引适用于处理大量文本数据,它能够快速地找出包含特定单词或短语的记录。但是,全文索引并不适用于简单的...

    基于mysql全文索引的深入理解

    MySQL全文索引是一种高效检索大量文本数据的机制,尤其适用于大数据搜索场景。在MySQL 5.5.24版本中,全文索引主要用于提升文本字段的搜索效率,它通过分词技术将文本拆分成可搜索的词项。全文索引在MyISAM存储引擎...

    MySQL全文索引应用简明教程

    MySQL全文索引是一种高效检索文本数据的机制,它在处理大量文本数据的查询时能显著提升性能。全文索引在数据库设计中起着至关重要的作用,尤其对于那些需要执行复杂文本搜索的应用程序。 首先,创建全文索引需要...

    MySQL创建全文索引分享

    MySQL全文索引是一种提高数据库查询性能的技术,尤其适用于大规模文本数据的检索。它通过分词技术和特定的算法,分析文本中的关键词频率和重要性,从而快速定位到匹配的记录。在MySQL中,全文索引主要应用于MYISAM...

    mysql 全文模糊查找 便捷解决方案

    总之,MySQL的全文模糊查找是提高数据库搜索效率的有效手段,而PHP的Unicode工具类可以帮助我们处理中文字符,使其在MySQL全文搜索中得以应用。通过这样的组合,开发者可以构建出适应多语言环境的高效搜索系统。

    coreseek中文全文索引解决方案

    MySQL全文索引增强** CoreSeek通过与MySQL的紧密集成,提供了一种无缝的全文索引解决方案。用户可以通过SQL语句进行全文检索,同时保持对MySQL数据库的原生操作。这不仅简化了开发流程,也降低了系统的学习成本。 ...

    mysql的索引优化

    4. **全文索引**:适用于对文本类型的列进行全文搜索,自MySQL 3.23.23版本开始支持。创建方式: - 创建表时指定全文索引:`CREATE TABLE 表名 (..., FULLTEXT INDEX [索引名] (列名列表));` - 修改表添加全文索引...

    Solr3.6用DIH组件进行MySQL数据库全文索引部署包

    Solr3.6用DIH组件进行MySQL数据库全文索引部署包 完整的工程部署包 apache-solr-3.6.0.xml 放入apache-tomcat-7.0.27\conf\Catalina\localhost

    MySQL中文全文索引插件64位版本

     ③、标准插件式:以MySQL 5.1全文索引的标准插件形式开发,不修改MySQL源代码,不影响MySQL的其他功能,可快速跟进MySQL新版本;  ④、支持版本多:支持所有的MySQL 5.1 Release Candidate版本,即MySQL 5.1.22 ...

    Mysql全文搜索match against的用法

    MySQL全文搜索功能主要依赖于`MATCH()`和`AGAINST()`两个函数,用于在MyISAM表类型的字段上执行高效的文本搜索。以下是对标题和描述中所述知识点的详细说明: 1. **全文搜索的前提条件** - 表的存储引擎必须是...

    mysql存储与索引技术

    MySQL 的索引分为两种主要类型:MyISAM 使用非聚集索引,索引与数据分开存储,而 InnoDB 使用聚集索引,索引和数据在同一结构中,因此 InnoDB 的索引支持更快的查找,但不支持全文检索。在索引优化方面,最左前缀...

    MySQL 索引最佳实践

    - **全文索引**:在MyISAM和计划在MySQL 5.6版本的InnoDB中可用,用于全文本搜索,如搜索引擎功能。 ### B-Tree索引详解 B-Tree索引具有多种实现方式,它们共享相同的加速操作特性,但根据内存和磁盘的不同使用...

Global site tag (gtag.js) - Google Analytics