笔记记录自林晓斌(丁奇)老师的《MySQL实战45讲》

(本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除)

11) --怎么给字符串字段加索引?

  日常工作中的登录系统,你很可能会使用emai这个字段。因此也很容易遇到类似这样的语句:

mysql> select *from user where email = 'xxx';

  我们知道,如果没有索引那就只能使用全表扫描。并且MySQL是支持前缀索引的,也就是说,你可以顶一个字符串的一部分作为索引。默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。由于email字段通常较长,如果你直接使用email作为索引的话,索引占用的空间就会较大。所以可以采用前缀索引的优势,比如,建立索引email(6),每个邮箱字段只取前6个字节。但这也会带来损失,如你可能会增加额外的记录扫描行数。因为前6位相同的邮箱就没办法直接通过eamil的索引来判断了。因此我们建议使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。

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

  我们知道,普通索引存储的是主键索引的值,因此,如果你不是select* 而是select id,email就可以不进行回表,也就是覆盖索引。但此处有一个隐藏的问题,即,如果你使用了email字段来作索引,没问题可以利用覆盖索引的性质来进行快速的查询。但如果你使用的是前缀索引email(255),(我们db中的email数据的长度均不超过它),虽然索引覆盖了全部长度的email的值,还是不能使用覆盖索引的性质。因为系统并不确定前缀索引是否截断了完整的信息,因此必须进行回表。

其他方式:

  当然,你也可能会遇到字段的前缀区分度不够高的情况。如我们国家的身份证号,对于同一个城市的人,身份证号前几位的区分度很低。此时,你可以有别的方式来进行处理如:

  • 使用倒序来存储数据。
  • 使用Hash字段存储。

  这两种方式的相同点是都不支持范围查询,并且都提供了足够多的区分度。另外,Hash计算的结果虽有冲突的可能,但概率很低,因此可以认为每次查询的扫描行数接近1.但使用Hash的方式会额外增加计算的消耗以及额外的存储空间的消耗。

上期问题:

  如果没有session A的配合,只是单独执行 delete from t; call idata(); explain这三条语句,会看到explain结果中rows字段其实还是再10000左右,即使用了索引,这是为什么呢?

  答:delete语句删掉了所有的数据,然后通过call idata()插入了10万行数据,看上去是覆盖了原来的10万行。但是,session A开启了事务并没有提交,所以之前插入的10w行数据不能删除,这样,之前的数据每一行都会有两个版本,旧版本是delete之前的数据,新版本是标记为delete的语句。这样索引a上的数据其实是有两份的。由于Mysql是使用删除标记来删除记录的,并不从索引和数据文件中真正删除。如果delete和insert中间的间隔相对较小,purge线程还没来得及清理记录。如果主键相同的情况下,新insert会沿用delete之前的记录空间,因此统计信息不变。

问题:

  如果你要维护学生信息的数据库,学生登录名统一是"学号@gamail.com",学号的规则是十五位的数字,前三位是城市编号,四到六位是学校编号,七到十位是入学年份,最后五位是顺序编号,只考虑登录验证的话,你会怎么设计这个登录名的索引呢?

MySQL 笔记整理(11) --怎么给字符串字段加索引?的更多相关文章

  1. MySQL:字符串字段加索引

    1. 使用方式 1.1 全字段加索引 给整个字段加索引,索引存储整个字段的值. 数据量较小时,查询成本高,准确度高: 数据量较大时,比较耗费空间: 1.2 前缀索引 MySQL支持前缀索引,可以定义字 ...

  2. 最全mysql笔记整理

    mysql笔记整理 作者:python技术人 博客:https://www.cnblogs.com/lpdeboke Windows服务 -- 启动MySQL net start mysql -- 创 ...

  3. mysql中一半会选择什么样的字段为索引?(含索引创建删除查看公式)

    一.数据量庞大的数据做索引 二.该字段经常出现在where的后面,以条件形式存在,经常被用户搜索的字段 三.很少被增删改的字段,因为增删改后,索引会重新排序 索引的创建 create index 索引 ...

  4. MySQL性能优化 - 别再只会说加索引了

    MySQL性能优化 MySQL性能优化我们可以从以下四个维度考虑:硬件升级.系统配置.表结构设计.SQL语句和索引. 从成本上来说:硬件升级>系统配置>表结构设计>SQL语句及索引, ...

  5. MySQL 笔记整理(18) --为什么这些SQL语句逻辑相同,性能却差异巨大?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 18) --为什么这些SQL语句逻辑相同,性能却差异巨大? 本篇我们以三 ...

  6. MySQL 笔记整理(5) --深入浅出索引(下)

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 5) --深入浅出索引(下) 这次的笔记从一个简单的查询开始: 建表语句是这样的 mysql> create table T ...

  7. MySQL 笔记整理(1) --基础架构,一条SQL查询语句如何执行

    最近在学习林晓斌(丁奇)老师的<MySQL实战45讲>,受益匪浅,做一些笔记整理一下,帮助学习.如果有小伙伴感兴趣的话推荐原版课程,很不错. 1) --基础架构,一条SQL查询语句如何执行 ...

  8. MySQL 笔记整理(10) --MySQL为什么有时会选错索引?

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 10) --MySQL为什么有时会选错索引? MySQL中的一张表上可以 ...

  9. MySQL 笔记整理(2) --日志系统,一条SQL查询语句如何执行

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 2) --日志系统,一条SQL查询语句如何执行 MySQL可以恢复到半个月内任意一秒的状态,它的实现和日志系统有关.上一篇中记录了一 ...

随机推荐

  1. ISCC 2018 (Please give me username and password)

    做过iscc 2018之后有了很多的感触,也有更多的了解自己的不足之处,整理了一下web的wp, 为了保证各位小伙伴的阅读质量,我将会把wp以每一道题一个博文的形式写出来,希望能够帮助到你们 其中的步 ...

  2. css3波纹特效、H5实现动态波浪

    css3实现动态波纹特效,由于css3里面有过渡和动画效果,现在利用css3实现动态波浪效果就很简单了,直接使用transform来实现就ok, 使得translateX 产生偏移就可以不断实现循环动 ...

  3. 计算机17-3,4作业A

    A货车过隧道问题 Description 输入若干组数据,每组数据中有三个整数分别表示某条公路沿途所经过的三个隧道的最大高度,数之间用单个空格分隔.输入高度单位是厘米,范围在0到762之间.现有一台高 ...

  4. python基于selenium实现自动删除qq空间留言板

    py大法好,让你解放双手. 脚本环境 python环境,selenium库,Chrome webdriver驱动等. 源码 # coding=utf-8 import datetime import ...

  5. 面试题-浅谈JavaScript中的This指向问题

    各位小伙伴在面试中被面试官问道this指向问题一定不少吧,同时还被问道apply,call和bind的用法区别,现在,就来简单的聊一聊this到底指向何方. 1.基本概念 MDN的官方解释:与其他语言 ...

  6. 那些年我们一起踩过的Dubbo"坑"

    前言 微服务架构在如今的9102年已经不是什么新鲜的话题了,但是怎么做好微服务架构,却又是一个永恒的话题.比如服务粒度的划分,怎么控制好粗细?服务划分后,对于项目的部署会有什么改变?...  这会是一 ...

  7. Netty源码—七、内存释放

    Netty本身在内存分配上支持堆内存和直接内存,我们一般选用直接内存,这也是默认的配置.所以要理解Netty内存的释放我们得先看下直接内存的释放. Java直接内存释放 我们先来看下直接内存是怎么使用 ...

  8. 来聊一聊不low的Linux命令——find、grep、awk、sed

    前几天面试,被一位面试官嫌弃了"你的Linux命令有点low".被嫌弃也挺正常的,因为我的简历写的我自己都有点看不下去:了解Linux常用命令,如ls,tail -f等命令,基本满 ...

  9. angular开发环境搭建及新建项目

    最近一个星期准备学习一下angular前端框架,因为之前在学习abp框架的时候,都要求前端要掌握angular,所以不得不回来恶补一下了,学习的过程有时间的话会记录在这里,方便以后复习. 闲言少叙,下 ...

  10. Jenkins忘记admin密码处理方法

    1.先找到enkins/config.xml文件,并备份. 此文件位于Jenkins系统设置的主目录,根据自己的配置情况而定.我的位置如下 /data/temp/jenkins/config.xml2 ...