mysql 前缀索引 语法_MySQL 前缀索引

mysql 前缀索引 语法_MySQL 前缀索引索引前缀使用字符串列的索引规范中的语法,您可以创建仅使用列首字符的索引。以这种方式仅索引列值的前缀可以使索引文件小得多。为a或column编制索引时,必须为索引指定前缀长度。例如:col_name(N)NBLOBTEXTCREATETABLEtest(blob_colBLOB,INDEX(blob_col(10)));前缀最长可以为1000个字节(InnoDB表中为767…

大家好,又见面了,我是你们的朋友全栈君。

索引前缀

使用 字符串列的索引规范中的语法,您可以创建仅使用列首字符的索引 。以这种方式仅索引列值的前缀可以使索引文件小得多。为a 或 column 编制索引时 , 必须为索引指定前缀长度。例如: col_name(N)NBLOBTEXT

CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));

前缀最长可以为1000个字节(InnoDB表中为767个字节 ,除非已 innodb_large_prefix设置)。

注意 前缀限制以字节为单位,而在前缀长度CREATE TABLE, ALTER TABLE和 CREATE INDEX语句被解释为非二进制串类型的字符数(CHAR, VARCHAR, TEXT对于二进制串类型),并且字节数(BINARY, VARBINARY, BLOB)。为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑到这一点。

如果搜索词超过索引前缀长度,则使用索引排除不匹配的行,然后检查其余行是否可能匹配。

当要索引的列字符很多时 索引则会很大且变慢

( 可以只索引列开始的部分字符串 节约索引空间 从而提高索引效率 )

原则: 降低重复的索引值

例如现在有一个地区表

area

gdp

code

chinaShanghai

100

aaa

chinaDalian

200

bbb

usaNewYork

300

ccc

chinaFuxin

400

ddd

chinaBeijing

500

eee

发现 area 字段很多都是以 china 开头的

那么如果以前1-5位字符做前缀索引就会出现大量索引值重复的情况

索引值重复性越低 查询效率也就越高

前缀索引测试

// 创建一个测试表

CREATE TABLE `x_test` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`x_name` varchar(255) NOT NULL,

`x_time` int(10) NOT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4145025 DEFAULT CHARSET=utf8mb4

// 添加200万条测试数据

INSERT INTO x_test(x_name,x_time) SELECT CONCAT(rand()*3300102,x_name),x_time FROM x_test WHERE id < 30000;

1.在无任何索引的情况下随便查询一条

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:2.253s

2.添加前缀索引 ( 以第一位字符创建前缀索引 )

alter table x_test add index(x_name(1))

再次查询相同sql语句

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:3.291s

当使用第一位字符创建前缀索引后 貌似查询的时间更长了

因为只第一位字符而言索引值的重读性太大了

200万条数据全以数字开头那么平均20万条的数据都是相同的索引值

3.重新建立前缀索引 这次以前4位字符来创建

alter table x_test add index(x_name(4));

再次查询相同sql语句

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:0.703s

这次以前4位创建索引 大大减少了索引值的重复性 查询速度从3秒提升到0.7秒

4.200万条数据都以数字开头 而0-9排列组合7位则可达到千万种组合

也就是以前7位来做索引则不会出现重复索引值的情况了

alter table x_test add index(x_name(7));

再次查询相同sql语句

SELECT * FROM x_test WHERE x_name = ‘1892008.205824857823401.800099203178258.8904820949682635656.62526521254’;

查询时间:0.014s ( 首次执行无缓存状态下 )

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142267.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • i2c时序图的详细讲解[通俗易懂]

     i2c简易时序图  启动信号:  SCL为高电平的时候,SDA由高电平向低电平跳变。结束信号:SCL为高电平的时候,SDA由低电平向高电平跳变。  应答信号:  I2C总线上的所有数据都是以8位字节传送的,发送器每发送一个字节,就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规…

    2022年4月14日
    829
  • CAN通信详解(全)

    本章我们将向大家介绍如何使用STM32自带的CAN控制器来实现两个开发板之间的CAN通讯,并将结果显示在TFTLCD模块上。本章分为如下几个部分:30.1CAN简介30.2硬件设计30.3软件设计30.4下载验证30.1CAN简介CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在当前的汽车产业中,出于对安全…

    2022年4月1日
    75
  • AVC1与H264的差别

    AVC1与H264的差别

    2021年12月3日
    53
  • robotium有源码

    robotium有源码Robotium环境搭建及有源码测试用例编写:http://blog.sina.com.cn/s/blog_68f262210102v6yf.htmlAndroid自动化测试之Robotium学习:http://www.2cto.com/kf/201209/157011.htmlRobotium:http://www.2cto.com/kf/201304/205363.ht

    2022年7月25日
    5
  • 夜深人静写算法(一)- 搜索入门

    夜深人静写算法(一)- 搜索入门搜索入门:深度优先搜索(记忆化、剪枝、IDA*)、广度优先搜索(A*、双向广搜)

    2022年7月26日
    7
  • 2020年公认最快的dns_2021最快最稳定的dns排行

    2020年公认最快的dns_2021最快最稳定的dns排行简介:2020国内速度最快的dns推荐原版周公解梦分析梦见儿子死了的吉凶境遇安全,推荐长辈惠泽,推荐承受父祖之余德,前辈之提拔,而得大成功及发展,原命若喜水木者更佳。若凶数者:成又转败,陷于离乱变动,至晚年终归孤独失败,又早年有落水灾遇,生涯九死一生之命格。国内又须戒色变及刀杀之危。梦到蛇和蛇一头,速度暗示你可能会受到别人的欺骗,或受到别人欺骗。最快梦见蛇的心理学解梦从做梦内容的本义来说:推荐动物…

    2025年9月3日
    11

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号