当前位置: 首页 > news >正文

为什么要使用前缀索引,以及建立前缀索引:sql示例

背景:

你想啊,数据库里有些字段,它老长了,就像那种 varchar(255) 的字段,这玩意儿要是整个字段都拿来建索引,那可太占地方了。打个比方,这就好比你要在一个超级大的笔记本上记东西,每页都写得满满的,找个东西都费劲,而且还浪费本子。

这时候,前缀索引就闪亮登场啦!前缀索引呢,就是不拿整个长字段去建索引,而是取这个字段前面的一部分字符来建索引。就比如说那个 varchar(255) 的字段,咱就取它前 20 个字符来建索引。

为啥要这么干呢?好处可多了去了。首先,它能省硬盘空间啊。你想,原来要把 255 个字符的信息都放到索引里,现在只放 20 个字符,这能省多少地方啊,就像把一个大笔记本换成了一个小笔记本,多划算。

其次,虽然只取了前面一部分字符建索引,但大部分情况下,这前 20 个字符就能区分不同的数据了,查起来速度也不会慢太多。就好比你在一堆人里找张三,你不用记住他身上所有的特征,只要记住他最明显的那几个特征,就能快速把他找出来。

所以啊,碰到长字段的时候,别傻乎乎地整个字段去建索引,整前缀索引,既省了硬盘空间,又能保证一定的查询效率,这买卖稳赚不赔!

语法

在 MySQL 里,创建前缀索引的基本语法如下:

-- 创建表时同时创建前缀索引
CREATE TABLE table_name (
    column1 datatype,
    column2 datatype,
    ...
    INDEX index_name (column_name(length))
);

-- 对已存在的表添加前缀索引
ALTER TABLE table_name
ADD INDEX index_name (column_name(length));

-- 或者使用 CREATE INDEX 语句
CREATE INDEX index_name ON table_name (column_name(length));

在上述语法中:

  • table_name 是表的名称。
  • column_name 是要创建前缀索引的列名。
  • length 是指定用于创建索引的前缀长度。

示例

1. 创建表时同时创建前缀索引

假设我们有一个用户表 users,其中有一个 email 字段是 VARCHAR(255) 类型,我们想要对 email 字段的前 20 个字符创建前缀索引,可使用如下 SQL 语句:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(255),
    INDEX idx_email_prefix (email(20))
);
2. 对已存在的表添加前缀索引

如果 users 表已经存在,我们可以使用 ALTER TABLE 语句来添加前缀索引:

ALTER TABLE users
ADD INDEX idx_email_prefix (email(20));

或者使用 CREATE INDEX 语句:

CREATE INDEX idx_email_prefix ON users (email(20));

注意事项

  • 前缀长度选择:选择合适的前缀长度很重要。长度过短可能导致索引的区分度不够,影响查询效率;长度过长则会增加索引的存储空间,降低插入和更新操作的性能。你可以通过分析数据的分布情况,结合 EXPLAIN 语句来评估不同前缀长度的效果。
  • 查询使用:在使用前缀索引进行查询时,查询条件要符合前缀匹配规则。例如,对于上面创建的 email 前缀索引,查询 WHERE email LIKE 'example%' 可以利用该索引,而 WHERE email LIKE '%example' 则无法利用。

相关文章:

  • python中如何把dataframe转换为列表及其性能比较
  • 【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真(基于运放的电流模BGR)
  • 【氮化镓】高输入功率应力诱导的GaN 在下的退化LNA退化
  • 【C】初阶数据结构9 -- 直接插入排序
  • Compose 实践与探索二 —— 状态订阅与自动更新1
  • Blueprint —— 蓝图技术指南
  • 初始化E9环境,安装Sqlserver数据库
  • 分布式事务的原理
  • 贪心算法精解:用C++征服最优解问题
  • 数据链路层 (以太帧 MAC地址 ARP协议)
  • 基于SpringBoot的手机销售网站设计与实现(源码+SQL脚本+LW+部署讲解等)
  • Liunx(CentOS-6-x86_64)使用Nginx部署Vue项目
  • 水下机器人推进器PID参数整定与MATLAB仿真
  • 同步模式之顺序控制,如何控制三个线程依次输出: abc abc abc abc abc?
  • 本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件
  • 无刷电动智能充气泵方案【天吉智芯】
  • 【软件逆向】QQ 连连看小游戏去广告与一键消除实现
  • 数据量过大的时候导出数据很慢
  • 蓝桥杯备赛-基础训练(四)字符串 day17
  • 初识Spring Batch:开启批处理的高效之旅
  • 俄乌交换205名被俘人员,俄方人员已抵达白俄罗斯
  • 新华社:赵心童世锦赛夺冠,中国书写斯诺克运动新历史
  • 从陈毅杯到小应氏杯,五一长假上海掀起围棋热
  • 心期末后有人传——《钱谦益年谱长编》在钱氏故里首发
  • 光明日报头版评论:让投身西部成为青春潮流
  • 出现这几个症状,说明你真的老了