索引

mysql中关于索引的一些知识记录。索引能非常有效的提高检索速度,在100万数据表上,从无所有,速度从1~3秒,提升至0.01秒之间。索引虽然非常高效,但是,维护索引,也是需要代价,另外,合理的建索引,才能用上。索引覆盖、索引的最左原则,索引的B+树数据结构等等。

待持续收集……

异常

建索引异常

参考这两篇文章。文章1 / 文章2

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',这种格式查询,会发生一次,类型转换,从而导致,索引失效。(即,不要对字段进行计算,否则,可能会导致索引失效)