索引
mysql中关于索引的一些知识记录。索引能非常有效的提高检索速度,在100万数据表上,从无所有,速度从1~3秒,提升至0.01秒之间。索引虽然非常高效,但是,维护索引,也是需要代价,另外,合理的建索引,才能用上。索引覆盖、索引的最左原则,索引的B+树数据结构等等。
待持续收集……
异常
建索引异常
CREATE TABLE `config` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT ,
`title` varchar(255) NOT NULL COMMENT '配置名称' ,
`val` text NULL COMMENT '配置值' ,
`cmt` varchar(255) NOT NULL DEFAULT '' COMMENT '配置说明' ,
`deleted_at` int(255) NULL DEFAULT 0 COMMENT '删除状态' ,
`created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE INDEX `uniq_title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
报错信息:
Execute: Index column size too large. The maximum column size is 767 bytes.
数据库版本:
select version()
-- 5.6.29-enterprise-commercial-advanced-log
方式1:
增加 ROW_FORMAT=DYNAMIC 即可。后来顺道也把unique的字段改小了一点。
CREATE TABLE `config` (
`id` int UNSIGNED NOT NULL AUTO_INCREMENT ,
`title` varchar(20) NOT NULL COMMENT '配置名称' ,
`val` text NULL COMMENT '配置值' ,
`cmt` varchar(255) NOT NULL DEFAULT '' COMMENT '配置说明' ,
`deleted_at` int(255) NULL DEFAULT 0 COMMENT '删除状态' ,
`created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE INDEX `uniq_title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
说明:
INNODB 引擎,UTF-8,索引默认最大 767。
方式2:
除了上面的方式,还可以设置数据库:
set global innodb_file_format = BARRACUDA
set global innodb_large_prefix = ON
-- 查看是否生效
show variables like 'character%';
show variables like 'collation_%';
show variables like 'innodb_large_prefix';
show variables like 'innodb_file_format';
类型转换导致索引失效
比如,int字段,查询的时候,使用了field='1',这种格式查询,会发生一次,类型转换,从而导致,索引失效。(即,不要对字段进行计算,否则,可能会导致索引失效)