怎么给字符串字段加索引
创建完整索引,会占用比较多的空间
创建前缀索引
比如需要给用户表的name字段增加索引,取前6字符作为前缀索引,命令是
alter table user add index idx_name name(6);
但千万注意,此时创建的name索引无法和主建id组成覆盖索引,
select name, id from user;
此时必须回表根据id查出记录。
创建前缀索引时,指定多长的字符,推荐以能覆盖95%以上的数量为宜; 可以这样统计:
select count (distinct name) as L;
select count( distinct left(name, 4)) as L4,
count( distinct left(name, 5)) as L5,
count( distinct left(name, 6)) as L6,
count( distinct left(name, 7)) as L7
from user;
以上的L4~L7中,找出不小于L * 95%的值,比如
6,7 的长度满足覆盖了95%的总数的话,就建立长度为6的前缀索引
倒序存储和建立hash字段
前缀索引需要根据能覆盖的总数来建立,如果前缀字符的区分度不高,需要建立更长的字段,这样建立的前缀索引会占用更多空间。
有两种方式可以解决前缀长度区分度不够的问题
- 每次倒序存储,这样反过可以对字符串后几位建立索引,查询时也需要倒过来查询
select * from user where name = reverse('lisi')
- 使用crc32取字符串的hash值,并一并存储,建立索引。
mysql> alter table t add id_card_crc int unsigned, add index(id_card_crc);
查询时
select field_list from t where id_card_crc=crc32("lisi")
倒叙存储和hash字段,由于对字符串进行了操作,因此无法对其使用区间搜索。
另外前缀索引由于无法提供完整的字段信息,就用不了覆盖索引的优化了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署