笔记记录自林晓斌(丁奇)老师的《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. log4j java项目中的配置

    第一步你需要 相关的jar包 第二歩你需要一个关于log4j的配置文件 第三歩 你需要一个检测用的java 文件 导入这两个jar包进你的项目中 commons-logging.jar log4j-1 ...

  2. Windows上安装配置SSH教程(4)——WinSCP+OpenSSH 使用公钥自动登陆

    -------------------- 知识点汇总:http://www.cnblogs.com/feipeng8848/p/8559803.html -------------------- 重要 ...

  3. 谈谈 ANR 之 Service 超时

    1. 核心源码 关键类 路径(/frameworks/base/) ActiveServices.java services/core/java/com/android/server/am/Activ ...

  4. 基于.NET CORE微服务框架 -谈谈surging 的messagepack、protobuffer、json.net 序列化

    1.前言 surging内部使用的是高性能RPC远程服务调用,如果用json.net序列化肯定性能上达不到最优,所以后面扩展了protobuf,messagepack序列化组件,以支持RPC二进制传输 ...

  5. MIP ACCESS细节剖析

    什么是 MIP ACCESS MIP ACCESS 由百度 MIP 团队开发的一种页面访问权限控制机制,能够允许网页发布者在页面元素中定义内容标记,并结合用户访问情况进行综合评价,从而展现或隐藏页面中 ...

  6. 华为手机无法使用USB调试的解决方案

    在Android开发中,一直在使用华为的荣耀8进行调试,但是突然某一次,发现USB调试无法使用了,且在其他的电脑上进行调试也不行. 后来经过查资料,总算解决了此问题,在这里进行一下解决方案的记录. 需 ...

  7. Java相关面试题总结

    本文分为十九个模块,分别是: Java 基础.容器.多线程.反射.对象拷贝.Java Web .异常.网络.设计模式.Spring/Spring MVC.Spring Boot/Spring Clou ...

  8. 从壹开始前后端 [vue后台] 之一 || 权限后台系统 1.0 正式上线

    缘起 哈喽各位小伙伴周三好,春节已经过去好多天了,群里小伙伴也各种催搞了,新年也接了新项目,比较忙,不过还是终于赶上这个二月的尾巴写了这篇文章,也把 vue 权限后台上线了(项目地址:http://1 ...

  9. Spring Boot 入门教程 | 图文讲解

    目录 一.Spring Boot 是什么 二.为什么要使用 Spring Boot 三.快速入门 3.1 创建 Spring Boot 项目 3.2 项目结构 3.3 引入 Web 依赖 3.4 编写 ...

  10. [转载]学习Javascript闭包(Closure)

    学习Javascript闭包(Closure)     源地址: http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures ...