第零步:简单说一说

有时候需要索引很长的字符(例如BLOB,TEXT,或者很长的VARCHAR),这样会使得索引又大又慢。

改良方法有:1.改用哈希索引(这里不讲)。2.使用字符串的前几个字符作为索引(即前缀索引)。

下面具体主要说第2种方法,主要思路就是选择足够长的前缀以保证较高的选择性,同时又不能太长(造成空间浪费)。

所谓选择性,是指不重复的索引数量除以总记录数,范围是(0,1],唯一索引之所以查询效率高,是因为它的选择性等于1。首先要做的是准备好足够的数据来进行测试,最简单的方法是:

我们刚安装好MySQL的时候,会有一个叫sakila的数据库,这个数据库可以方便我们进行各种练习。

下面我们直接开始行动~用Navicat打开sakila数据库(没有Navicat?那就命令行use sakila吧)

第一步:建立测试表及其数据

-- 新建一个测试表city_demo,并把表city的数据复制过去

INSERT INTO city_demo SELECT city FROM city;

-- 把表city_demo自身的数据复制5次,即反复执行下面这句语句5次

INSERT INTO city_demo SELECT city FROM city_demo;

-- 将表里面的城市名随机打乱(这一步生成的结果会与我之后展示的数据有差别,但并不影响分析)

UPDATE city_demo SET city = (SELECT city FROM city ORDER BY RAND() LIMIT 1);

第二步:计算合适的前缀索引长度

有两种方法计算长度

方法一:

-- 查询重复次数最多的10条完整城市名称及其数量(图1)

SELECT COUNT(*) cnt, city FROM city_demo GROUP BY city ORDER BY cnt DESC LIMIT 10;

-- 查询重复次数最多的10条城市名称(前3个字符)及其数量,可以发现:前3个字符的相同数量过大,不适合做前缀索引(图2)

SELECT COUNT(*) cnt, LEFT(city,3) pref FROM city_demo GROUP BY pref ORDER BY cnt DESC LIMIT 10;

-- 查询重复次数最多的10条城市名称(前7个字符)及其数量,可以发现:前7个字符的相同数量和完整城市名称很相近了,可以考虑作为做前缀索引(图3)

SELECT COUNT(*) cnt, LEFT(city,7) pref FROM city_demo GROUP BY pref ORDER BY cnt DESC LIMIT 10;

图1:

图2:

图3:

方法二:

-- 计算出完整字符串的选择性(图4)

SELECT COUNT(DISTINCT city)/COUNT(*) FROM city_demo;

-- 计算各个前缀的选择性(图5),然后找出选择性与图4相近的

SELECT

COUNT(DISTINCT LEFT(city,3))/COUNT(*) pref3,

COUNT(DISTINCT LEFT(city,4))/COUNT(*) pref4,

COUNT(DISTINCT LEFT(city,5))/COUNT(*) pref5,

COUNT(DISTINCT LEFT(city,6))/COUNT(*) pref6,

COUNT(DISTINCT LEFT(city,7))/COUNT(*) pref7

FROM city_demo;

图4:

图5:

不过pref4和pref5是一个陷阱,因为它们看上去已经很接近完整字符串的选择性了,但是我们可以用方法一来看一下:

-- 结果看图6

SELECT COUNT(*) cnt, LEFT(city,4) pref4 FROM city_demo GROUP BY pref4 ORDER BY cnt DESC LIMIT 5;

-- 结果看图7

SELECT COUNT(*) cnt, LEFT(city,5) pref5 FROM city_demo GROUP BY pref5 ORDER BY cnt DESC LIMIT 5;

图6:

图7:

可以看出,前缀4和5的分布还是不均匀的以Sant、South为首的城市仍然比较多,结合方法一、二,可以建立长度为7的前缀索引了

第三步:建立前缀索引

ALTER TABLE `city_demo` ADD INDEX `idx_city` (`city`(7)) USING BTREE ;

-- 或者这个也行

ALTER TABLE `city_demo` ADD KEY `idx_city` (`city`(7))

-- 又或者直接用Navicat可视化操作也行

前缀索引的缺点

MySQL中无法使用前缀索引进行ORDER BY和GROUP BY,也无法用来进行覆盖扫描

mysql索引 钱缀_【mysql索引】之前缀索引-Go语言中文社区相关推荐

  1. mysql索引 钱缀_-MySQL索引背后的数据结构及算法原理--索引选择性与前缀索引

    既然索引可以加快查询速度,那么是不是只要是查询语句需要,就建上索引?答案是否定的.因为索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,同时索引会加重插入.删除和修改记录时的负担 ...

  2. .tar.gz mysql 安装_mysql tar.gz 版本 linux系统的安装-Go语言中文社区

    mysql下载地址: https://dev.mysql.com/downloads/mysql/ 1.  上传下载的tar.gz文件发送到linux 上传的路径: /usr/local/mysql/ ...

  3. MySQL非分片字段查询_Mycat从入门到放弃-Go语言中文社区

    当初写这篇文章的初衷只是想提醒自己在用一个开源产品前不仅要了解其提供的功能,更要了解其功能和场景边界. 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下图中的一个My ...

  4. grpc java 泛型_关于使用GRPC遇到的BUG-Go语言中文社区

    GRPC获取服务器数据是耗时操作,不能写在UI主线程中,可以写在子线程或使用AsyncTask实现获取数据,但实测,仅仅是获取少量数据,可以写在UI主线程中(虽然不推荐这么做).目前博主在AsyncT ...

  5. mysql索引 钱缀_mysql字符串前缀索引

    比如,这两个在 email 字段上创建索引的语句: mysql> alter table SUser add index index1(email); 或 mysql> alter tab ...

  6. mysql隐式锁定辅助索引_当Mysql - InnoDB行锁遇到复合主键和多列索引-Go语言中文社区...

    背景 今天在配合其他项目组做系统压测,过程中出现了偶发的死锁问题.分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了 ...

  7. mysql text 查询速度_数据库学习之让索引加快查询速度(四)

    数据库学习之让索引加快查询速度 目录 索引简介 mysql的索引分类 创建索引 添加与删除索引 索引简介 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构. ...

  8. MySQL为数据创建索引的目的_为数据表创建索引的目的是什么

    一.SQL创建索引的目的如下: 1.通过唯一性索引(unique)可确保数据的唯一性: 2.加快数据的检索速度: 3.加快表之间的连接: 4.减少分组和排序时间: 5.使用优化隐藏器提高系统性能. 二 ...

  9. mysql联合索引查找过程_(MYSQL)回表查询原理,利用联合索引实现索引覆盖

    一.什么是回表查询? 这先要从InnoDB的索引实现说起,InnoDB有两大类索引: 聚集索引(clustered index) 普通索引(secondary index) InnoDB聚集索引和普通 ...

最新文章

  1. 视频分辨率无损放大软件 Topaz Video Enhance AI 2.3.0
  2. JSONUtil,POJO实体类和JSON互转,
  3. Linux 第70天 mariadb transaction, log
  4. 解决:The application could not be installed: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
  5. 数据传输示例 Moves.asm
  6. 转: Oracle 索引详解
  7. hutool 获取某月最后一天_hutool定时任务
  8. linux 架设J2EE网站过程分享之二 —— JDK安装
  9. 顶尖技术专家严选,15场前沿论坛思辨,2019中国大数据技术大会邀您共赴!
  10. 在python中print表示的数据类型是_在python中自己写的数据类型使用print无法输出每个元素...
  11. Lucene创建索引与搜索索引试手
  12. 云安全-Python实现凯撒密码和替换密码的加密解密与暴力破解
  13. JavaScript纯前端上传和下载文件
  14. NetApp 数据存储阵列 EF 系列——用于大数据分析和高性能计算
  15. 用idea使用struts和hibernate来实现CRUB的操作
  16. MongoDB 安装报错:无法启动此程序,缺少dll文件
  17. 【模型压缩】深度卷积网络的剪枝和加速(含完整代码)
  18. 亲测无限坐席在线客服系统源码+新UI版
  19. 考研必备100个网站
  20. Gulp编译、合并、压缩,以及Browsersync实时刷新教程

热门文章

  1. MATLAB应用实战系列(五十四)-MATLAB多维度绘图实战应用案例
  2. AB测试:基础概念、应用场景及入门指南
  3. tableau实战系列(十八)-通过可视化实现购物篮关联分析( Market Basket Analysis),关联物品之间的关联关系
  4. fmincon函数求解过程中出现无解的情况
  5. 二分逼近二分查找 高效解析800万大数据之区域分布
  6. excel操作技巧记录(实时更新)
  7. 【LeetCode从零单排】No121 Best Time to Buy and Sell Stock
  8. Java获取真实的IP地址--转载
  9. 编程语言拟人化:Java、C++、Python、Ruby、PHP、C#、JS!--隆重推荐转
  10. 元宇宙企业大比拼:云宇宙数据中台:iwemeta.com