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 相关文章推荐
MySQL 隔离数据列和前缀索引的使用总结
May 14 MySQL
MySQL为id选择合适的数据类型
Jun 07 MySQL
探究Mysql模糊查询是否区分大小写
Jun 11 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
防止web项目中的SQL注入
Dec 06 MySQL
MySQL中int (10) 和 int (11) 的区别
Jan 22 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
mysql幻读详解实例以及解决办法
Jun 16 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 $_SERVER当前完整url的写法
2009/11/12 PHP
php配置php-fpm启动参数及配置详解
2013/11/04 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
Yii2 rbac权限控制操作步骤实例教程
2016/04/29 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
2017/06/09 PHP
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
2013/05/28 Javascript
Nodejs Express4.x开发框架随手笔记
2015/11/23 NodeJs
JS实现日期时间动态显示的方法
2015/12/07 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
javascript 实现动态侧边栏实例详解
2016/11/11 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
ES6中Array.find()和findIndex()函数的用法详解
2017/09/16 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
浅谈JavaScript中this的指向更改
2020/07/28 Javascript
Python和php通信乱码问题解决方法
2014/04/15 Python
python中__call__方法示例分析
2014/10/11 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
Python pyinotify模块实现对文档的实时监控功能方法
2018/10/13 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
详解numpy.ndarray.reshape()函数的参数问题
2020/10/13 Python
python中Mako库实例用法
2020/12/31 Python
python opencv实现图像配准与比较
2021/02/09 Python
美国家居装饰店:Z Gallerie
2020/12/28 全球购物
会计学应届毕业生推荐信
2013/11/04 职场文书
任课老师推荐信范文
2013/11/24 职场文书
大学生关于奋斗的演讲稿
2014/01/09 职场文书
高中毕业自我评价
2014/02/08 职场文书
应届毕业生应聘自荐信范文
2014/02/26 职场文书
竞选学习委员演讲稿
2014/04/28 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
公司新人试用期自我评价
2014/09/17 职场文书
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers