一:概述

  - 我有一个需求是需要邮箱登录的,

  - mysql> select f1, f2 from SUser where email='xxx';

  - 我们知道,如果不在 email 上建立索引,那么将会走全表扫描。

  - 于是,我们有两种建立方式

    - mysql> alter table SUser add index index1(email);       // 普通索引

    - mysql> alter table SUser add index index2(email(6));   // 前缀索引

二:普通索引和前缀索引的区别?

  - 我们看看,他们建立的索引树有什么不同

     -                     

  

  - 从图中你可以看到

    - 由于 email(6) 这个索引结构中每个邮箱字段都只取前 6 个字节(即:zhangs),所以占用的空间会更小,这就是使用前缀索引的优势。

    - 但,这同时带来的损失是,可能会增加额外的记录扫描次数。 
 

三:普通索引和前缀索引查询流程的不同?

    - 举例

      - select id,name,email from SUser where email='zhangssxyz@xxx.com';

    - 普通索引

      - 从索引树找到满足索引值是 'zhangssxyz@xxx.com' 的这条记录,取得 ID2 的值;

      - 到主键上查到主键值是 ID2 的行,判断 email 的值是正确的,将这行记录加入结果集;

      - 取索引树上刚刚查到的位置的下一条记录,发现已经不满足 email='zhangssxyz@xxx.com'的条件了,循环结束。

      - 这个过程中,只需要回主键索引取一次数据,所以系统认为只扫描了一行。

    - 前缀索引

      - 索引树找到满足索引值是 'zhangs' 的记录,找到的第一个是 ID1;

      - 到主键上查到主键值是 ID1 的行,判断出 email 的值不是'zhangssxyz@xxx.com',这行记录丢弃;

      - 取到刚刚查到的位置的下一条记录,发现仍然是’zhangs‘,取出 ID2,再到 ID 索引上取整行然后判断,这次值对了,将这行记录加入结果集;

      - 重复上一步,直到取到的值不是'zhangs'时,循环结束。

      - 在这个过程中,要回主键索引取 4 次数据,也就是扫描了 4 行。

    - 结论

      - 通过这个对比,你很容易就可以发现,使用前缀索引后,可能会导致查询语句读数据的次数变多。

四:区分度

  - 通过上面的测试,我们知道,是否会导致查询变多,主要是建立前缀索引的区分度的选择。

  -  SELECT COUNT(DISTINCT LEFT(column_name, $length)) / COUNT(*) FROM table_name;  // 查询区分度

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

  - 使用前缀索引后,无法在使用覆盖索引,面对查询条件,可能需要回表操作。

六:面对字符串,我们也可以采取其他方式存储

  - hash

  - bit 位

  - 倒序

  - 等等

《Mysql - 字符串索引应该如何建立?》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Other-Website-Contents.md

    title: 本站目录 categories: Other sticky: 10 toc: true keywords: 机器学习基础 深度学习基础 人工智能数学知识 机器学习入门 date: 999 ...

  2. python去掉字符串中重复字符的方法

      If order does not matter, you can use   foo = "mppmt" "".join(set(foo)) set() ...

  3. Jetbrain全栈最新激活方法(2019年及之前所有新老版本)

    随着2019版的到来,之前的永久激活教程也不生效了,所以今天为大家带来一种新的永久激活方式. 1.下载新版破解补丁 破解补丁传送门提取码:3e8j 点击传送门下载补丁文件 jetbrains-agen ...

  4. meshing-三棱锥结构化网格

    原视频下载地址: https://yunpan.cn/cqcq2gE6Iy2P8  访问密码 7d5a ​

  5. 20175234 2018-2019-2 实验四 Android程序设计

    目录 20175234 2018-2019-2 实验四 Android程序设计 任务一 任务二 任务三 任务四 任务五 问题及解决措施 码云链接 参考资料 20175234 2018-2019-2 实 ...

  6. TynSerial序列(还原)TClientDataSet

    TynSerial序列(还原)TClientDataSet 可以一次性序列(还原)多个TClientDataSet. 1)TClientDataSet查询数据 procedure TForm1.Qry ...

  7. pytorch基础学习(二)

    在神经网络训练时,还涉及到一些tricks,如网络权重的初始化方法,优化器种类(权重更新),图片预处理等,继续填坑. 1. 神经网络初始化(Network Initialization ) 1.1 初 ...

  8. python __new__

    1.__new__的作用是什么? 依照Python官方文档的说法,__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程 ...

  9. Docs-.NET-C#-指南-语言参考-预处理器指令:#define(C# 参考)

    ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#define(C# 参考) 1.返回顶部 1. #define(C# 参考) 2018/06/30 使用 #define 来定 ...

  10. JAVA关于静态static的面试题

    JAVA关于静态static的面试题     版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net ...