广告
返回顶部
首页 > 资讯 > 数据库 >MySQL中字符串索引的创建规则有哪些
  • 421
分享到

MySQL中字符串索引的创建规则有哪些

2024-04-02 19:04:59 421人浏览 安东尼
摘要

Mysql中字符串索引的创建规则有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如何更好的创建字符串索引我们知道,mysq

Mysql字符串索引的创建规则有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

如何更好的创建字符串索引

我们知道,mysql中,数据和索引都是在一颗 B+树 上,我们建立索引的时候,这棵树所占用的空间越小,检索速度就会越快,而varchar格式的字符串有些会很长,那么在效率为上的今天,我们如何更加合理的建立字符串的索引呢?
假如说我们一张表中存在 email 字段,现在要给 email 字段创建索引,email 字段值的格式为:zhangsan@qq.com。

有2种建立索引的方式:

1、直接给 email 字段建立索引:alter table t add index index1(email);

索引树结构为:

MySQL中字符串索引的创建规则有哪些

2、建立 email 的前缀索引:alter table t add index index2(email(6));

索引数据结构为:

MySQL中字符串索引的创建规则有哪些

此时我们的查询语句为:select id,name,email from t where email='zhangsh223@xxx.com';

当使用index1索引时其执行步骤为:

1、从index1索引树查找索引值为zhangsh223@xxx.com的主键值ID1;

2、根据ID1回表查到该行数据确实为zhangsh223@xxx.com,将结果加入结果集;

3、继续查找index1索引树下一个索引值是否满足zhangsh223@xxx.com,不满足则结束查询。

当使用index2索引时其执行步骤为:

1、从index2索引树查找索引值为zhangs的主键值ID1;

2、根据ID1回表查到该行数据确实为zhangsh223@xxx.com,将结果加入结果集;

3、 继续查找index2索引树下一个索引值是否满足zhangs,满足则继续回表查询该行数据是否为zhangsh223@xxx.com,不是则跳过继续查找;

4、持续查找index2索引树,直到索引值不是zhangs为止。

从以上分析中我们可以看出,全字段索引相比前缀索引来说,减少了回表的次数,但是如果我们将前缀从6个增加到7个8个的话,前缀索引回表的次数就会减少,也就是说,只要定义好前缀的长度,我们就能既节省空间又保证效率。

那么问题来了,我们怎么衡量使用前缀索引的长度呢?

1、使用 select count(distinct email) as L from t; 查询字段不同值的个数;

2、依次选取不同的前缀长度查看不同值的个数:

select
 count(distinct left(email,4))as L4,
 count(distinct left(email,5))as L5,
 count(distinct left(email,6))as L6,
 count(distinct left(email,7))as L7,
from t;

然后根据实际可接受的损失比例,选取适合的最短的前缀长度。

前缀的长度问题我们解决了,但是一个问题是,如果使用前缀索引,那我们索引覆盖的特性就用不到了。
用全字段索引时,当我们查询select id,email from t where email='zhangsh223@xxx.com';时,不用回表直接就能查到id和email字段。

但是用前缀索引时,Mysql并不清楚前缀是否会整个覆盖email的值,无论是否全包含都会根据主键值回表查询判断。

所以说,使用前缀索引虽然能节省空间保证效率但是却不能用到覆盖索引的特性,是否使用就在于具体考虑了。

其他字符串索引创建方式

实际情况实际考虑,并不是所有的字符串都能使用前缀截取的方式创建索引,如身份证号或者ip这些字符串使用前缀索引就不合理了,身份证号一般同一个地区的人前几位都是一模一样的,使用前缀索引就不合理了,而ip值我们一般在实际中将其转化为数字去存储。

针对身份证号,我们可以使用倒叙存储,取前缀创建索引或者使用crc32()函数来获取一个hash校验码(int值)当做索引。

倒叙:select field_list from t where id_card = reverse('input_id_card_string');

crc32:select field_list from t where id_card_crc=crc32('input_id_card_string') and id_card='input_id_card_string'

这两种方式相对来说效率都差不多,都不支持范围查找,支持等值查找。

在倒叙方式中,需要使用reverse函数,但是回表次数可能比hash方式多。

在hash方式中,需要新建一个索引字段并调用crc32()函数。(注意:crc32()函数获取的结果不保证能唯一,可能存在重复的情况,但是这种情况概率较小),回表次数少,几乎1次就行。

最后

针对字符串索引,一般有以下几种创建方式:

1、字符串较短,直接全字段索引

2、字符串较长,且前缀区分度较好,创建前缀索引

3、字符串较长,前缀区分度不好,倒叙或hash方式创建索引(这种方式范围查询就不行了)

4、根据实际情况,遇到特殊字符串,特殊对待,如ip。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: MySQL中字符串索引的创建规则有哪些

本文链接: https://www.lsjlt.com/news/55646.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • MySQL中字符串索引的创建规则有哪些
    MySQL中字符串索引的创建规则有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。如何更好的创建字符串索引我们知道,MySQ...
    99+
    2022-10-18
  • mysql索引建立规则有哪些
    mysql索引建立规则有哪些,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  mysql建立索引常用的规则如下:  1、表的主...
    99+
    2022-10-18
  • mysql创建索引的原则有哪些
    创建索引的原则有以下几点:1. 选择合适的列:选择作为索引的列应该是经常用于查询和连接的列,而不是很少使用的列。2. 索引的选择性:...
    99+
    2023-09-21
    mysql
  • Mysql中复合索引使用规则有哪些
    这篇文章主要介绍了Mysql中复合索引使用规则有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 联合索引验证:从左向右发挥作用索引:(...
    99+
    2022-10-18
  • Python字符串的创建方法有哪些
    Python中字符串的创建方法有以下几种:1. 使用引号括起来的文本来创建字符串,可以使用单引号或双引号。例如:```str1 = ...
    99+
    2023-10-09
    Python
  • mysql创建索引的方式有哪些
    在MySQL中,有以下几种方式可以创建索引:1. CREATE INDEX语句:可以使用CREATE INDEX语句来创建索引。语法...
    99+
    2023-09-26
    mysql
  • mysql创建索引的方法有哪些
    小编给大家分享一下mysql创建索引的方法有哪些,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!在执行CREATE TABLE语句时可以创建索引,也可以单独用CREATE INDEX或ALTER...
    99+
    2022-10-18
  • mysql中适合加索引的字段有哪些
    这篇文章将为大家详细讲解有关mysql中适合加索引的字段有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。数据库中字段适合添加索引的有表中某个字段值离散度越高越适合,占...
    99+
    2022-10-18
  • python中字符串常用的内建函数有哪些
    python中字符串常用的内建函数有以下几种capitalize() 将字符串的第一个字符转换为大写的表示形式。title() 返回的是每个单词的首字母大写。istitle() 判断每个单词的首字母是否是大写,返回结果是布尔类型。upper...
    99+
    2022-10-17
  • MySQL数据库中建立索引的优缺点有哪些
    MySQL数据库中建立索引的优缺点有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。为什么要创建索引呢  这是因为,创建索引可以大大提高系统...
    99+
    2022-10-18
  • ORACLE MYSQL中join 字段类型不同索引失效的情况有哪些
    小编给大家分享一下ORACLE MYSQL中join 字段类型不同索引失效的情况有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作