3、创建索引的原则
- 数据量小时索引意义不大,这样的索引对性能提升不大,反而消耗系统资源。
- 索引不是越多越好,索引会影响insert、update、delete操作性能
- 避免对更新频繁的表和字段创建索引,当数据更改时,索引也同时会更新,消耗资源
- 不要在区分度低的字段上建立索引,如在性别(男、女)创建索引完全没有优化效果
- 当字段值具有唯一性时使用唯一性索引能提升性能,如果账户的邮箱和手机号字段
- 对频繁排列和分组的字段创建组合索引
- 使用短索引
- 删除未使用的索引
4、
5、覆盖索引
覆盖索引是指索引包含了所有要查询的字段信息。通常我们根据where条件来创建索引,不过这只是索引优化的一个方面。优秀的索引设计还应该考虑整个查询,如果索引的叶子节点中已经包含了要查询的数据,我们还有什么必要回差表呢?当发起一个被索引覆盖的查询时,explain的extra列会出现“Using index”信息
6、索引性能测试
测试环境:MySQL8.0.19,默认配置,使用CentOS虚拟机安装,虚拟机配置4G内存2CPU.
1)创建一个用户表,并在表中插入300W条数据
CREATE TABLE `bd_user` ( `id` bigint(0) NOT NULL, `dept_id` bigint(0) NULL DEFAULT NULL COMMENT ‘部门ID‘, `user_code` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘用户编码‘, `user_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘用户名称‘, `birthday` date NULL DEFAULT NULL COMMENT ‘生日‘, `usable` bit(1) NULL DEFAULT NULL COMMENT ‘是否可用‘, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = ‘用户‘ ROW_FORMAT = DYNAMIC;
2)测试语句一
select * from bd_user where user_code in(‘0000000014‘,‘0000001000‘,‘0000101000‘);
在user_code不使用索引时,查询时间约1秒,对该字段添加普通索引,查询时间约0.027秒,唯一索引的效果跟普通索引差不多。
MySQL性能优化-索引
标签:索引数据 utf8 memory ati 设置 birt 范围 dex from