搜索使用到的全文索引,对比like模糊查询,速度可提升N倍

全文索引

全文索引可以用来查找正文中的中文,只有在mysql 5.7.6之后,才能使用到检索功能,因为在mysql5.7.6之后,加入了中文分词器,比如“今天天气真好!”会被切割为“今天”,“天气”很多个词,然后会引用到全文索引搜索。

创建表的全文索引

Create table fulltext_test(
  Id ==int(11) NOTNULLAUTO_INCREMENT,==

  contenttextNOTNULL,

  tagvarchar(255),

  PRIMARYKEY(id),

  FULLTEXTKEYcontent_tag_fulltext(content,tag)  //创建联合全文索引列


)ENGINE=MyISAMDEFAULTCHARSET=utf8;
  


在已经有的表创建全文索引

Alter table fulltext_test add fulltext index content_tag_fulltext(content,tag);

注意查询的精度问题,在mysql中,规定的最小长度为4,需要可修改。

show variables like '%ft%';

可以看到这两个变量在 MyISAM 和 InnoDB 两种存储引擎下的变量名和默认值

//MyISAM
ft_min_word_len=4;
ft_max_word_len=84;

//InnoDB
innodb_ft_min_token_size=3;
innodb_ft_max_token_size=84;

修改mysql的/etc/my.cnf文件,在[mysqld]下面追加内容

[mysqld] innodb_ft_min_token_size = 1 ft_min_word_len = 1

重启mysql,然后之前建的索引也要重建。

建索引之后的匹配方式:

  • 自然语言全文索引
Select * fromtest where match(content) against('aaaa');
  • 布尔全文索引
Select * from test where match(content) against('a*'inbooleanmode);
  1. + 必须包含该词
  2. - 必须不包含该词
  3. > 提高该词的相关性,查询的结果靠前
  4. < 降低该词的相关性,查询的结果靠后
  5. (*)星号 通配符,只能接在词后面

其它常用的符号可以查下手册。

欢迎关注公证号:我只是个码字的,一起学习编程知识!

<think>嗯,我需要解释数据库索引是什么。首先,用户可能对数据库有基本了解,但索引的具体概念作用可能不太清楚。我应该从类比开始,比如书籍的目录,这样更直观。 接下来,要明确索引的定义。它是数据库中的一种数据结构,帮助快速查询。这里可能需要提到数据结构,比如B树、哈希表,但不用太深入。 然后,得说明索引的作用,加快查询速度。但也要提到代价,比如占用存储空间,影响增删改的效率。这部分需要平衡,用户可能不知道索引的缺点。 还要区分不同的索引类型,比如单列、组合、唯一索引,每种类型用例子说明。例如,单列索引是针对一个字段,组合索引是多个字段的组合,唯一索引保证唯一性。 然后,工作原理部分,需要简单解释为什么索引能加快查询。比如不用全表扫描,而是用树结构快速定位。但避免太技术性的术语,保持易懂。 使用场景也很重要,用户需要知道什么时候该建索引,比如经常查询的列,高区分度的字段。同时,什么时候不适合,比如频繁更新的表或者小数据量表。 最后,注意事项部分,要提醒用户索引不是越多越好,维护成本的问题。还有组合索引的顺序影响效果,以及定期维护索引的必要性。 整个过程中,要确保结构清晰,逐步引导用户理解。使用例子比喻帮助记忆,同时保持语言口语化,避免生硬的技术术语。检查是否符合之前的系统指令,比如数学公式的正确格式,但这里可能用不上太多数学内容,主要文字解释。确保每个部分简短,用分点的方式让读者容易跟进。</think>数据库索引是一种用于提升数据检索效率的数据结构。以下从概念到应用逐步解释: 一、索引的直观类比(书籍目录) 就像书籍的目录能快速定位章节位置,数据库索引通过建立特定字段的「快速查找路径」,使系统无需逐行扫描整个数据表。例如: - 无索引时:查找姓名=张三的记录需遍历所有数据行 - 有索引时:通过姓名索引直接定位到存储位置 二、核心特征 1. 数据结构支持 - 常用B+树(范围查询高效) - 哈希表(精确匹配快速) $$ \text{查询时间} \begin{cases} O(n) & \text{无索引全表扫描} \\ O(\log n) & \text{B+树索引} \\ O(1) & \text{哈希索引} \end{cases} $$ 2. 存储代价 - 需要额外磁盘空间(约占原表10%-20%) - 更新数据时需同步维护索引 三、索引类型对比 | 类型 | 示例SQL | 适用场景 | |-----------|--------------------------|--------------------| | 单列索引 | `CREATE INDEX idx_name ON users(name)` | 高频查询单个字段 | | 组合索引 | `CREATE INDEX idx_name_age ON users(name, age)` | 多条件联合查询 | | 唯一索引 | `CREATE UNIQUE INDEX idx_email ON users(email)` | 防止重复值(如身份证号) | | 全文索引 | `FULLTEXT(content)` | 文本内容的模糊匹配 | 四、工作原理演示 假设用户表有10万条记录: ```sql -- 无索引查询 SELECT * FROM users WHERE phone = '13800138000'; -- 需扫描10万行 -- 创建索引后 CREATE INDEX idx_phone ON users(phone); SELECT * FROM users WHERE phone = '13800138000'; -- 仅需3-4次B+树查找 ``` 五、最佳实践原则 1. 创建条件(同时满足): - 字段区分度高(如手机号 > 性别) - 查询频率 > 更新频率 - 数据量 > 1万条 2. 避免滥用场景: - 频繁更新的字段(如订单状态) - 小数据量表(<1万条) - 长文本字段(应使用全文索引) 六、注意事项 1. 索引失效常见原因: - 对字段进行运算:`WHERE age+1 > 20` - 使用前导通配符:`LIKE '%abc'` - 类型转换:字符串字段用数字查询 2. 维护策略: - 定期分析索引使用率 - 重建碎片化索引(REINDEX) - 监控索引存储增长 通过合理使用索引,可使查询速度提升10-100。例如某电商平台在订单号字段添加索引后,订单查询响应时间从2.1秒降低到23毫秒。但需注意平衡查询优化与维护成本的关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值