《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,一经查实,立即删除!

相关文章

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

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

poj 1088

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

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

创建一个表,然后使用查询语句: 查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 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…

HTML5 video

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

明源面试

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

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

肯德基收银系统模式肯德基:肯塔基炸鸡 (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转载)

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

pvr波形是什么意思_PVR的完整形式是什么?

pvr波形是什么意思PVR:Priya村路演 (PVR: Priya Village Roadshow) PVR is an abbreviation of Priya Village Roadshow. It is one of the biggest and leading multiplex cinema chains in India. PVR是Priya Village Roadshow的缩写 。 它是印度最大和领先的多元…

《MySQL——查询长时间不返回的三种原因与查询慢的原因》

目录查询长时间不返回等MDL锁等flush等行锁查询慢构造一张表,表有两个字段id和c,再里面插入了10万行记录 create table t (id int(11) not null,c int(11) default null,primary key (id) ) engine InnoDB;delimiter ;; create procedure idata() begi…

《MySQL——幻读与next-key lock与间隙锁带来的死锁》

create table t (id int(11) not null,c int(11) default null,d int(11) default null,primary key (id),key c (c) ) engine InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25);该表除了主键id,还有索引c。 问下面的语句…

css 阴影 效果_CSS阴影效果

css 阴影 效果CSS中的阴影效果 (Shadow Effects in CSS) It is always good to make our web pages stylish and beautiful, web pages that would catch users eyes instantly but one gets confused as to how to style his or her web page. The confusion is quite legit t…

《MySQL——加锁规则(待补全,有些没看懂)》

catalog加锁规则等值查询间隙锁非唯一索引等值锁主键索引范围锁非唯一索引范围锁唯一索引范围锁 bug非唯一索引上存在"等值"的例子limit语句加锁关于死锁总结 1、查询过程中访问到的对象才会加锁,而加锁的基本单位是next-key lock(前开后闭&am…

PHP环境搭建:Windows 7下安装配置PHP+Apache+Mysql环境教程

这两天刚装好Windows 7,碰巧前段时间有朋友问我Windows下如何安装搭建PHP环境,所以打算勤劳下,手动一步步搭建PHP环境,暂且不使用PHP环境搭建软件了,在此详细图解在Windows 7下安装配置PHPApacheMysql环境的教程&#…

《MySQL—— 业务高峰期的性能问题的紧急处理的手段 》

catalog短连接风暴先处理占着连接但是不工作地线程减少连接过程的消耗慢查询性能问题索引没有设计好语句没写好选错索引QPS突增问题短连接风暴 正常的短连接: 执行很少sql语句就断开,下次需要的时候再重连。MySQL建立连接的过程成本很高,包含…

《MySQL——redo log 与 binlog 写入机制》

目录binlog写入机制redo log写入机制组提交机制实现大量的TPS理解WAL机制如何提升IO性能瓶颈WAL机制告诉我们:只要redo log与binlog保证持久化到磁盘里,就能确保MySQL异常重启后,数据可以恢复。 下面主要记录一下MySQL写入binlog和redo log的…

字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用。当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也…

WPF CanExecuteChanged

继承ICommand ,RelayCommand命令 1 public class RelayCommand : ICommand2 {3 private readonly Action _execute;4 private readonly Func<bool> _canExecute;5 public event EventHandler CanExecuteChanged;6 public RelayComma…

《MySQL——主备一致性六问六答》

目录备库为什么要设置为只读模式&#xff1f;备库设置为只读&#xff0c;如何与主库保持同步更新&#xff1f;A到B的内部流程如何&#xff1f;binlog内容是什么&#xff1f;row格式对于恢复数据有何好处M-M结构的循环复制问题以及解决方案备库为什么要设置为只读模式&#xff1…

fyi 在邮件里是什么意思_FYI的完整形式是什么?

fyi 在邮件里是什么意思仅供参考&#xff1a;供您参考 (FYI: For Your Information) FYI is an acronym of "For Your Information". It is a widespread internet slang used these days in text messaging, instant messaging, and chatting on Facebook, WhatsApp…

Hyper-V 替换 vmwp

要激活 Hyper-V 下的虚机 最简单的方法是用带证书的vmwp替换掉原来的 带证书的vmwp参见&#xff1a;http://bbs.pcbeta.com/viewthread-1408240-1-1.html 下载后腰替换 先把 Hyper-V 的俩服务停止掉 然后找到 C:\Windows\System32\vmwp.exe 右键--安全 替换掉所有者 然后给自己…