MySQL创建索引需要了解的


Posted in MySQL onApril 08, 2021

前言: 

在 MySQL 中,基本上每个表都会有索引,有时候也需要根据不同的业务场景添加不同的索引。索引的建立对于数据库高效运行是很重要的,本篇文章将介绍下创建索引相关知识及注意事项。

1.创建索引方法

创建索引可以在建表时指定,也可以建表后使用 alter table 或 create index 语句创建索引。下面展示下几种常见的创建索引场景。

# 建表时指定索引
CREATE TABLE `t_index` (
  `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `col1` int(11) NOT NULL,
  `col2` varchar(20) NOT NULL,
  `col3` varchar(50) NOT NULL,
  `col4` int(11) NOT NULL,
 `col5` varchar(50) NOT NULL,
  PRIMARY KEY (`increment_id`),
  UNIQUE KEY `uk_col1` (`col1`),
  KEY `idx_col2` (`col2`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='测试索引';

# 创建索引(两种方法)
# 普通索引
alter table `t_index` add index idx_col3 (col3); 
create index idx_col3 on t_index(col3);
# 唯一索引
alter table `t_index` add unique index uk_col4 (col4);
create unique index uk_col4 on t_index(col4);
# 联合索引
alter table `t_index` add index idx_col3_col4 (col3,col4);
create index idx_col3_col4 on t_index(col3,col4);
# 前缀索引
alter table `t_index` add index idx_col5 (col5(20)); 
create index idx_col5 on t_index(col5(20));

# 查看表索引
mysql> show index from t_index;
+---------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t_index |          0 | PRIMARY  |            1 | increment_id | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| t_index |          0 | uk_col1  |            1 | col1         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| t_index |          1 | idx_col2 |            1 | col2         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| t_index |          1 | idx_col3 |            1 | col3         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+---------+------------+----------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

2.创建索引所需权限

如果你用的不是 root 账号,那创建索引就要考虑权限问题了,是不是需要 create、alter 权限就行了呢?下面我们来具体看下。

# 测试用户的权限
mysql> show grants;
+-------------------------------------------------------------------------------------+
| Grants for testuser@%                                                               |
+-------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%'                                                |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `testdb`.* TO 'testuser'@'%' |
+-------------------------------------------------------------------------------------+

# alter table 方式创建索引
mysql> alter table `t_index` add index idx_col2 (col2);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

# create index 方式创建索引
mysql>  create index idx_col3 on t_index(col3);
ERROR 1142 (42000): INDEX command denied to user 'testuser'@'localhost' for table 't_index'

# create index 方式创建索引还需要index权限 赋予index权限后再执行
mysql> create index idx_col3 on t_index(col3);
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

从上面测试可以看出,使用 alter table 方式创建索引需要 alter 权限,使用 create index 方式创建索引需要 index 权限。

另外说明下,删除索引也是可以使用 alter table `tb_name` drop index xxx 和 drop index xxx on tb_name 两种方式,分别需要 alter 和 index 权限。

索引的优点显而易见是可以加速查询,但创建索引也是有代价的。首先每建立一个索引都要为它建立一棵B+树,会占用额外的存储空间;其次当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。所以我们创建索引时还是需要根据业务来考虑的,一个表中建议不要加过多索引。

以上就是MySQL创建索引需要了解的的详细内容,更多关于MySQL创建索引的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
May 25 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
MySQL 逻辑备份 into outfile
May 15 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL数据库实验实现简单数据库应用系统设计
Jun 21 MySQL
MySQL约束(创建表时的各种条件说明)
Jun 21 MySQL
MySQL控制流函数(-if ,elseif,else,case...when)
Jul 07 MySQL
MySQL数据管理操作示例讲解
Dec 24 MySQL
MySQL 使用SQL语句修改表名的实现
详解Mysql 函数调用优化
Apr 07 #MySQL
MySQL复制问题的三个参数分析
Apr 07 #MySQL
MySQL pt-slave-restart工具的使用简介
Apr 07 #MySQL
MySQL主从复制断开的常用修复方法
Apr 07 #MySQL
MySQL infobright的安装步骤
Apr 07 #MySQL
MySQL表的增删改查基础教程
You might like
php adodb连接带密码access数据库实例,测试成功
2008/05/14 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
js防止DIV布局滚动时闪动的解决方法
2014/10/30 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
js使用setTimeout实现定时炸弹的方法
2015/04/10 Javascript
jquery获取节点名称
2015/04/26 Javascript
JS实现网页上随滚动条滚动的层效果代码
2015/11/04 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
Vue2.0父子组件传递函数的教程详解
2017/10/16 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
vue实现todolist基本功能以及数据存储功能实例详解
2019/04/11 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
Python之Django自动实现html代码(下拉框,数据选择)
2020/03/13 Python
解决pycharm中的run和debug失效无法点击运行
2020/06/09 Python
python import 上级目录的导入
2020/11/03 Python
台湾良兴购物网:EcLife
2019/12/01 全球购物
车间操作工岗位职责
2013/12/19 职场文书
晚宴邀请函范文
2014/01/15 职场文书
母亲节感恩寄语
2014/02/21 职场文书
领导班子四风查摆对照检查材料思想汇报
2014/10/05 职场文书
大学生党员批评与自我批评范文
2014/10/14 职场文书
迎国庆主题班会
2015/08/17 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
CentOS8.4安装Redis6.2.6的详细过程
2021/11/20 Redis
关于MySQL临时表为什么可以重名的问题
2022/03/22 MySQL
Redis Lua脚本实现ip限流示例
2022/07/15 Redis