Mysql Fulltext 全文索引 score值 含义及取值

本文详细介绍了在Mysql8环境下如何创建和使用全文索引,包括支持的引擎、字段类型以及如何通过MATCH AGAINST语法进行全文搜索,并解释了查询结果中score值的意义和计算匹配度百分比的方法。

环境Mysql8 支持fulltext全文索引的引擎为InnoDB MyISAM. 支持char varchar text类型的字段作为全文索引。

CREATE TABLE test_text (
          id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
          info VARCHAR(2000),
          FULLTEXT (info)
) ENGINE=InnoDB;

INSERT INTO test_text (info) VALUES
        ('3453232453,3453424356,2341234,234231534,2154234'),
        ('123544345,3452345,32452,654643'),
        ('453,24352354,3454,3452,345346,4564,3435');

SELECT id, MATCH (info) AGAINST ('3453232453,3452345,2341234,234231534,2154234' IN NATURAL LANGUAGE MODE) AS score  FROM test_text order by score desc;

通过修改需要匹配的文本内容可以发现根据内容不同,score的取值并非0-1或者0-100

     在Mysql中通过MATCH(col1,col2..) AGAINST(expr..)语法得到的值并不能直接作为匹配相似度百分比来使用,该语句得到的score值与数据总量、文本值、分词符、匹配关键字长度等因素相关,score值越大代表匹配度越高,但是并不是匹配的相似度百分比。

      如果需要计算匹配度百分比,需要对所有score值求和,然后取 每条记录的score/sum(score) * 100 作为每条记录的相似度百分比。

 

参:mysql8match-against

       fulltext-score-explained

 

<think> 我们正在回答用户关于MySQL创建索引语句及其含义的问题。根据引用内容,我们可以总结出三种创建索引的方式:创建表时创建索引、使用CREATE INDEX语句、使用ALTER TABLE语句。 1. 创建表时创建索引: 在CREATE TABLE语句中直接定义索引,可以同时定义多个索引,包括PRIMARY KEY, UNIQUE, INDEX等。 2. 使用CREATE INDEX语句: 在已经存在的表上创建索引,但不能创建PRIMARY KEY索引。 3. 使用ALTER TABLE语句: 可以添加主键索引、唯一索引、普通索引、全文索引和组合索引。 接下来,我们将详细说明每种方式,并给出示例。 注意:在创建索引时,可以指定索引类型(如BTREE或HASH),但如果不指定,默认是BTREE(InnoDB存储引擎)。 同时,我们还要注意,索引名(index_name)对于普通索引、唯一索引等是可选的,如果不指定,MySQL会自动生成一个索引名(通常为列名)。 另外,用户需要了解不同索引类型的含义- PRIMARY KEY:主键索引,每个表只能有一个,不允许有空,且必须唯一。 - UNIQUE:唯一索引,保证列中每行数据的唯一性,允许有空- INDEX:普通索引,仅加速查询,没有唯一性要求。 - FULLTEXT全文索引,用于全文搜索,仅适用于MyISAM和InnoDB(MySQL5.6+)存储引擎。 - 组合索引:在多个列上建立的索引,遵循最左前缀原则。 下面我们分别给出三种创建索引方式的示例: 一、创建表时创建索引 语法: CREATE TABLE table_name ( 列1 数据类型, 列2 数据类型, ... [PRIMARY KEY (column),] -- 主键索引 [UNIQUE [index_name] (column),] -- 唯一索引 [INDEX [index_name] (column),] -- 普通索引 [FULLTEXT [index_name] (column),] -- 全文索引 [INDEX [index_name] (col1, col2, ...)] -- 组合索引 ) [存储引擎]; 示例: CREATE TABLE `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL, `email` VARCHAR(100), `age` INT, PRIMARY KEY (`id`), -- 主键索引 UNIQUE `idx_username` (`username`), -- 唯一索引,索引名为idx_username INDEX `idx_email` (`email`), -- 普通索引 INDEX `idx_age` (`age`), -- 普通索引,不指定索引名则自动生成 INDEX `idx_username_email` (`username`, `email`) -- 组合索引 ) ENGINE=InnoDB; 二、使用CREATE INDEX语句(不能用于主键索引) 语法: CREATE [UNIQUE] INDEX index_name [USING {BTREE | HASH}] ON table_name (column_list); 示例: -- 创建普通索引 CREATE INDEX idx_email ON user (email); -- 创建唯一索引 CREATE UNIQUE INDEX idx_username ON user (username); -- 创建组合索引 CREATE INDEX idx_user_info ON user (username, email); -- 指定索引类型(HASH索引,注意:InnoDB不支持HASH索引,所以一般用BTREE) CREATE INDEX idx_age USING BTREE ON user (age); 三、使用ALTER TABLE语句 语法: ALTER TABLE table_name ADD [PRIMARY KEY | UNIQUE | INDEX | FULLTEXT] [index_name] (column_list); 示例: -- 添加主键索引(注意:一个表只能有一个主键,且列必须非空) ALTER TABLE `user` ADD PRIMARY KEY (`id`); -- 添加唯一索引 ALTER TABLE `user` ADD UNIQUE `idx_username` (`username`); -- 添加普通索引 ALTER TABLE `user` ADD INDEX `idx_email` (`email`); -- 添加全文索引(注意:表类型必须支持,如MyISAM或InnoDB(MySQL5.6+)) ALTER TABLE `user` ADD FULLTEXT `idx_content` (`content`); -- 添加组合索引 ALTER TABLE `user` ADD INDEX `idx_name_email` (`username`, `email`); 删除索引的语句: 1. 使用DROP INDEX语句: DROP INDEX index_name ON table_name; 2. 使用ALTER TABLE语句: -- 删除主键索引(注意:因为主键只有一个,所以不需要指定索引名) ALTER TABLE table_name DROP PRIMARY KEY; -- 删除其他索引 ALTER TABLE table_name DROP INDEX index_name; 注意事项: - 主键索引只能通过PRIMARY KEY创建(在CREATE TABLE或ALTER TABLE中)。 - 全文索引的使用需要注意存储引擎的支持和版本。 - 组合索引要注意最左前缀原则。 最后,我们总结一下: MySQL创建索引有三种方式:建表时创建、CREATE INDEX、ALTER TABLE。其中,ALTER TABLE功能最全,可以创建任何索引(包括主键),而CREATE INDEX不能创建主键索引。 下面我们生成相关问题: </think> 以下是MySQL创建索引的完整语句及其含义解析,涵盖所有索引类型和创建方式: ### 一、索引创建语句及含义 #### 1. **主键索引(PRIMARY KEY)** ```sql ALTER TABLE `table_name` ADD PRIMARY KEY (`column`); ``` - **核心作用**:唯一标识每条记录,强制唯一性且不允许NULL - **存储结构**:自动创建聚簇索引(InnoDB引擎)[^4] - **示例场景**:用户表的用户ID字段 #### 2. **唯一索引(UNIQUE)** ```sql ALTER TABLE `table_name` ADD UNIQUE (`column`); ``` - **核心作用**:保证列唯一性,允许NULL(但只能有一个NULL) - **性能影响**:加速等查询,替代品为唯一约束[^1] - **示例场景**:用户邮箱、身份证号字段 #### 3. **普通索引(INDEX)** ```sql ALTER TABLE `table_name` ADD INDEX `index_name` (`column`); ``` - **核心作用**:加速WHERE条件筛选和JOIN操作 - **存储结构**:默认使用B+Tree结构(平衡查询效率与写入成本)[^2] - **示例场景**:订单表的用户ID外键字段 #### 4. **全文索引FULLTEXT)** ```sql ALTER TABLE `table_name` ADD FULLTEXT (`column`); ``` - **核心作用**:支持自然语言搜索(MATCH AGAINST语句) - **使用限制**:仅MyISAM/InnoDB(5.6+)支持,不支持前缀索引[^4] - **示例场景**:文章内容、商品描述的文本搜索 #### 5. **组合索引(多列索引)** ```sql ALTER TABLE `table_name` ADD INDEX `index_name` (`col1`,`col2`,`col3`); ``` - **核心作用**:优化多列联合查询,遵循**最左前缀原则** - **存储结构**:按声明顺序存储多列(如(col1,col2,col3)索引可优化`col1=?`、`col1=? AND col2=?`查询)[^1] - **示例场景**:联合查询姓氏+名字+年龄 #### 6. **创建表时定义索引** ```sql CREATE TABLE `user` ( `id` INT PRIMARY KEY, -- 主键索引 `email` VARCHAR(100) UNIQUE, -- 唯一索引 `name` VARCHAR(50), `age` INT, INDEX `idx_age` (`age`), -- 普通索引 FULLTEXT `idx_name` (`name`), -- 全文索引 INDEX `idx_combo` (`age`,`name`) -- 组合索引 ); ``` - **优势**:DDL语句一次性完成表结构与索引定义[^1] ### 二、索引创建原理说明 | 创建方式 | 语法示例 | 适用场景 | |----------------------|--------------------------------------------------------------------------|----------------------------------| | **ALTER TABLE** | `ALTER TABLE table ADD INDEX idx(column)` | 已存在表添加索引(最常用) | | **CREATE INDEX** | `CREATE INDEX idx_name ON table(column)` | 不修改表结构添加索引[^2] | | **建表时定义** | `CREATE TABLE(... , INDEX idx(column))` | 初始化表结构时使用 | | **隐式创建** | 主键/唯一约束自动创建索引 | 无需显式操作 | ### 三、索引创建注意事项 1. **命名规范**:推荐`idx_<column>_<suffix>`格式(如`idx_user_email`) 2. **索引长度**:对字符串列可指定前缀长度 ```sql ALTER TABLE `product` ADD INDEX `idx_name` (`name`(20)); -- 前20字符索引 ``` 3. **空间优化**:删除冗余索引 ```sql DROP INDEX `index_name` ON `table_name`; -- 删除索引语句[^3] ``` 4. **索引选择**:20-30%数据量的列适合建索引(超过则全表扫描可能更快) ### 四、索引性能验证方法 ```sql -- 查看索引使用情况 EXPLAIN SELECT * FROM table WHERE indexed_column = 'value'; -- 结果中关键字段: -- type: ref/range 表示使用索引 -- key: 显示使用的索引名 -- Extra: Using index 表示索引覆盖 ``` > 💡 **最佳实践**:组合索引字段顺序按**区分度从高到低**排列(如`(city, gender)`优于`(gender, city)`)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值