《MySQL——给长字符串加索引》

对于长字符串,可用如下方式建立索引:
(1)前缀索引
(2)字符串倒叙+前缀索引
(3)添加hash字段+并在hash字段上加索引
(4)字段拆分(一个字段可拆分为两个以上)

假设现在表User 中存在email字段,为长字符串。如果email字段上没有索引,那么这个语句只能做全表扫描

select f1,f2 from User where email = '1540984562@qq.com';

在email字段上创建索引
–创建的index1索引包含整个字符串

alter table User add index index1(email);

–创建的index2索引只包含字符串前6个字节

alter table User add index index2(email(6));

前缀索引占用的空间更小,但是会增加扫描的次数。
使用前缀索引,定义好长度,就可以做到既节省空间,又不额外增加太多查询成本。
在建立索引时关注区分度,可区分度越高,意味着重复的键值越少

可以依次选取不同长度的前缀来看这个值,比如看4~7个字节的前缀索引:

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 User;

前缀索引对覆盖索引的影响

如果我们的语句是:
select id,email from User where email = ‘1540984562@qq.com’;
这个语句只要求返回id和email字段。
如果使用的整个字符串作为索引,会触发覆盖索引,不需要回表ID索引再查询。
而如果使用的是前缀索引,就还得回表ID索引去获取email字段的完整值

所以如果使用了前缀索引就相当于放弃掉了覆盖索引对查询性能的优化了。

使用 倒序 与 hash 构造新字段

1、倒序
如果我们对身份证号码进行前缀索引提取,会发现,前面的号码重复率极高。
此时可以使用倒序存储
select field_list from t where id_card = reverse(‘input_id_card_string’);
由于身份证最后几位的重复逻辑较小,所以最后6位很可能提供了足够的区分度
2、hash字段
在表上再创建一个整数字段,来保存身份证的校验码,同时在这个字段上创建索引。

alter table t add id_card_crc int unsigned,add index(id_card_crc);

然后每次插入新纪录的时候,都同时用crc32()这个函数得到校验码填到这个新字段。
由于校验码可能存在冲突,也就是说两个不同的身份证号通过crc32()函数得到的结果可能相同,
所以查询语句还要判断id_card是否精确相同。

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

两者异同点:
相同
都不支持范围查询,只支持等值查询
不同
1、占用额外空间不同:
倒序存储不会消耗额外的存储空间。hash需要增加一个字段。
若倒序存储使用4个字节作为前缀不够,也会消耗额外字段
2、CPU消耗方面:
倒序每次都要调用reverse函数
hash需要调用crc32函数。reverse的时间复杂度会更小
3、查询效率:
hash字段查询性能相对更稳定,发生冲突概率很小,可以认为每次查询平均扫描行数为1.
倒序存储方式仍然使用的是前缀索引方式,还会增加扫描行数

总结:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377237.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[蓝桥杯历届试题] 欧拉与鸡蛋

大数学家欧拉在集市上遇到了本村的两个农妇,每人跨着个空篮子。她们和欧拉打招呼说两人刚刚卖完了所有的鸡蛋。 欧拉随便问:“卖了多少鸡蛋呢?” 不料一个说:“我们两人自己卖自己的,一共卖了150个鸡蛋,虽然…

Python元组练习

Here, we are covering following Python tuple exercises, 在这里,我们将介绍以下Python元组练习 , Creating & printing a tuple 创建和打印元组 Unpacking the tuple into strings 将元组解包成字符串 Create a tuple containing the letters of…

傻瓜教你看清MVC内部执行流程之ViewData数据传输,轻松学MVC--①目了然篇(待续)

1.首先在执行到Controller里面的action(方法)时,执行到最后会调用一个View()-->此方法是Controller的一个方法 源代码: View Code protected internal ViewResult View(){return View(null /* viewName */, null /* masterName */, null /* model */);} 2.然后继续调用自己…

《MySQL——count()逻辑》

count()用法 count()语义:该函数为一个聚合函数,对于返回的结果集一行行地判断,如果count函数地参数不是NULL,累计值就加1,否则不加。最后返回累计值。 所以count(*),count(主键id)和count(1)都表示返回满足条件地结果…

phpmailer 发送邮件

<?php /* 可用新浪和网易邮箱测试成功&#xff0c;但QQ不成功&#xff01; 下载 phpmailer 解压 http://phpmailer.worxware.com/要注意邮件服务器的端口号&#xff0c;默认是 25 不用修改&#xff0c;如果不是则要修改如下&#xff0c;在$mail->IsSMTP() ;下一行加上 $…

静态负载均衡和动态负载均衡_动态负载平衡

静态负载均衡和动态负载均衡动态负载平衡 (Dynamic Load Balancing) The algorithm monitors changes on the system workload and redistributes the work accordingly. 该算法监视系统工作负载的变化并相应地重新分配工作。 This algorithm works on three strategies: 该算…

poj 1088

题目&#xff1a;http://poj.org/problem?id1088 记忆化搜索&#xff0c;dp[r][c] max(dp[r - 1][c] , dp[r 1][c] , dp[r][c - 1] , dp[r][c 1]) 1 ( if (题目给的条件满足&#xff09;&#xff09; View Code 1 using namespace std;2 typedef long long ll;3 const in…

《MySQL——order by逻辑(全字段排序与rowid排序)》

创建一个表&#xff0c;然后使用查询语句&#xff1a; 查询城市是“杭州”的所有人名字&#xff0c;并且按照姓名排序返回前 1000 个人的姓名、年龄 create table t (id int(11) not null,city vachar(16) not null,name vachar(16) not null,age vachar(16) not null,addr va…

ruby 生成哈希值_哈希== Ruby中的运算符

ruby 生成哈希值In the last article, we have seen how we can compare two hash objects with the help of < operator? "<" method is a public instance method defined in Rubys library. 在上一篇文章中&#xff0c;我们看到了如何在<运算符的帮助下…

HTML5 video

摘要&#xff1a;本文主要介绍HTML5 video在android2.2中实现的主要架构和程序流程。 一、实现HTML5 video主要的类 1&#xff0e; 主要类结构及介绍 图1中绿色类为java类&#xff0c;其余为c类&#xff0c;下面是各个类的具体介绍: (1) HTMLElement类不是最上层类&#xff0c…

《MySQL——使用联合索引、覆盖索引,避免临时表的排序操作》

联合索引避免临时表排序 在上一篇笔记(MySQL——order by逻辑&#xff08;全字段排序与rowid排序&#xff09;)中&#xff0c;讲到查询语句查询多个字段的时候使用order by语句实现返回值是有序的&#xff0c;而order by是使用到了临时表的&#xff0c;会带来时间和空间损失。…

明源面试

明源面试&#xff0c;笔试题目如下 一、SQL测试题 1 有两张表 根据给出的SQL语句&#xff0c;写出返回的行数分别是多少&#xff1f;为了形象直观的显示&#xff0c;我给出了sql语句执行结果。 A 学生表 B分数表 新题目 select a.* from a inner join b on a.idb.id; …

AEAP的完整形式是什么?

AEAP&#xff1a;尽早 (AEAP: As Early As Possible) AEAP is an abbreviation of "As Early As Possible". AEAP是“ April越早”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking sites like Faceboo…

jquery 视觉特效(鼠标悬停时依次显示图片)

效果描述&#xff1a; 有几副图片&#xff0c;让他们依次叠加重合。首先显示第一张图片。然后鼠标悬停在上面&#xff0c;边框变化。然后离开&#xff0c;然后第一张淡出&#xff0c;第二张淡入。接着悬停在第二张图片&#xff0c;边框变化&#xff0c;然后离开&#xff0c;第二…

《MySQL tips:查询时,尽量不要对字段进行操作》

维护一个交易系统&#xff0c;交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。 建表语句如下&#xff1a; create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_mo…

cocos2dx blender 骨骼动画实现

前言 cocos2d-x 中相关部分代码介绍 背景知识介绍 参考 http://www.3dkingdoms.com/weekly/weekly.php?a4 一 简单3d 模型支持 第一步实现对3d 模型的简单支持&#xff0c;完成一个CCSprite3D 类 参考CCSprite 类 以及 CCGLProgram 代码 主要修改 draw 方法。 添加了定点数组…

关于web.config中customErrors节点说明

关于web.config中<customErrors>节点说明 <customErrors>节点用于定义一些自定义错误信息的信息。此节点有Mode和defaultRedirect两个属性&#xff0c;其中defaultRedirect属性是一个可选属性&#xff0c;表示应用程序发生错误时重定向到的默认URL&#xff0c;如果…

肯德基收银系统模式_肯德基的完整形式是什么?

肯德基收银系统模式肯德基&#xff1a;肯塔基炸鸡 (KFC: Kentucky Fried Chicken) KFC is an abbreviation of "Kentucky Fried Chicken". It is a fast-food restaurant chain whose specialty is known for fried chicken because of its specialization in it. It…

泛型(CSDN转载)

函数的参数不同叫多态&#xff0c;函数的参数类型可以不确定吗&#xff1f; 函数的返回值只能是一个吗&#xff1f;函数的返回值可以不确定吗&#xff1f; 泛型是一种特殊的类型&#xff0c;它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。 下面是两个经典…

《MySQL tips:隐式类型转换与隐式字符编码转换对查询效率的影响》

维护一个交易系统&#xff0c;交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。 create table tradelog (id int(11) not null,tradeid varchar(32) default null,operator int(11) default null,t_modified datetime default n…