MySQL中的存储引擎和单列索引的使用规则

MySQL中的ENGINE=InnoDB、MyiSam的区别

前情提要,今天上午在看一个关于SpringBoot的项目开发视频的时候注意到了视频中建立数据库表中所提到的MySQL数据库的存储引擎类型,常用的是InnoDB和MyiSam,就这两个存储引擎类型进行下了解学习吧。

在这之前需要引入一个概念:MySQL中的锁机制。相对于其他数据库而言,MySQL数据库的锁机制比较简单,特点是会根据不同的存储引擎支持不同的锁机制。

例如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。

MySQL中锁机制特点

表级锁: 开销小,加锁快;不会出现死锁(因为MyISAM会一次性获得SQL所需的全部锁);锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

MyiSam:V5.1版本前默认类型,表级锁

存储记录和文件的标准类型,支持全文搜索,可以被压缩,与其他引擎相比,有检查和修复表格的大部分工具,不支持事务,不支持外键。
强调的是性能,执行速度比较快,可以在不同的系统中迁移。
当另外一个线程想对数据表进行操作时,是不允许的,当前数据表已经被锁,只有该线程操作完成后才可进行其他线程对数据表的操作,以表为整体进行加锁。
所以,插入、修改、删除单项记录等对单行数据进行的操作不适用改存储引擎类型,但如果执行大量的查询操作,那可以选择MyISAM存储引擎类型。

InnoDB:当前默认类型,行级锁

支持事务处理等高级处理,支持外键,与上述所提到的MyiSam不同的是,InnoDB存储引擎锁机制采用了以行为单位进行加锁。
当数据库中存在大量的插入、修改等单行数据操作时,采用InnoDB较为合适,而且InnoDB在性能方面上也是最佳选择。、

更改数据表的引擎类型:ALTER TABLE table_name ENGINE = XXX

命令行模式下show engines命令可查看MySQL数据库中所有的存储引擎
这里写图片描述

MySQL中索引长度问题

关于索引:类比字典中的拼音首字母、偏旁笔画,在数据库查询中可以很高效的为我们进行数据查询,但是索引的建立也不宜过多,毕竟索引的管理也是占用资源的。遇到的问题是当给数据库某字段索引唯一时,出现了一个错误:

[Err] 1071 - Specified key was too long; max key length is 767 bytes
意思是:数据库索引长度已经达到长度限制,表中需要建立索引字段为open_id:varchar(1024)

官方解释:

"For CHAR, VARCHAR, BINARY, and VARBINARY columns, indexes can be created that use only the leading part of column values, using col_name(length) syntax to specify an index prefix length.
...
Prefixes can be up to 1000 bytes long (767 bytes for InnoDB tables). Note that prefix limits are measured in bytes, whereas the prefix length in CREATE TABLE statements is interpreted as number of characters ..."    
对于myisam和innodb存储引擎,prefixes的长度限制分别为1000 bytes和767 bytes。注意prefix的单位是bytes,但是建表时我们指定的长度单位是字符。

A utf8 character can use up to 3 bytes. Hence you cannot index columns or prefixes of columns longer than 333 (MyISAM) or 255 (InnoDB) utf8 characters.  
以utf8字符集为例,一个字符占3个bytes。因此在utf8字符集下,对myisam和innodb存储引擎创建索引的单列长度不能超过333个字符和255个字符

总结:对于单列索引来讲,索引长度的限制和存储引擎和字符集编码均有关联。

CREATE TABLE table_name (
    ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

当我们创建数据表的时候最后一条DDL语句,成为问题的关键部分。

CHARSET:字符集编码,常用的有三个:LATIN1单个字符长度为1个字节,GBK单个字符为2个字节,UTF8单个字符为3个字节。
ENGINE:对MyiSam和InnoDB存储引擎创建索引的单列长度不能超过333个字符和255个字符。

所以针对InnoDB的存储引擎 + UTF-8的编码格式,数据表中的open_id字段的长度已经超出限制,因此无法建立唯一单列索引。

解决方案:推荐方案1

1. 修改表字段长度限制,InnoDB + UTF-8 情况下不超过255字符。
2. 变更表编码格式为LATIN1,最大值为767。
3. 修改存储引擎类型为MyiSam。

猜你喜欢

转载自blog.csdn.net/Nerver_77/article/details/82423626