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 相关文章推荐
Navicat连接MySQL错误描述分析
Jun 02 MySQL
MySQL 外键约束和表关系相关总结
Jun 20 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
SQL基础的查询语句
Nov 11 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
MySQL实现配置主从复制项目实践
Mar 31 MySQL
MySQL数据库查询进阶之多表查询详解
Apr 08 MySQL
mysql使用 not int 子查询隐含陷阱
Apr 12 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 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 编写安全的代码时容易犯的错误小结
2010/05/20 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
Javascript 学习笔记 错误处理
2009/07/30 Javascript
extjs 为某个事件设置拦截器
2010/01/15 Javascript
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
JS函数实现动态添加CSS样式表文件
2012/12/15 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
一个html5播放视频的video控件只支持android的默认格式mp4和3gp
2014/05/08 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
bootstrap fileinput完整实例分享
2016/11/08 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
微信小程序之发送短信倒计时功能
2017/08/30 Javascript
Vue实现PopupWindow组件详解
2018/04/28 Javascript
JavaScript中工厂函数与构造函数示例详解
2019/05/06 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
详解Vue 换肤方案验证
2019/08/28 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
[01:02:32]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第二场 2月26日
2021/03/11 DOTA
python判断windows系统是32位还是64位的方法
2015/05/11 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
西班牙国家航空官方网站:Iberia
2017/11/16 全球购物
德国最大的服装、鞋子和配件在线商店之一:Outfits24
2019/07/23 全球购物
Simons官方网站:加拿大时尚零售商
2020/02/20 全球购物
数组越界问题
2015/10/21 面试题
最新创业融资计划书
2014/01/19 职场文书
Nginx解决前端访问资源跨域问题的方法详解
2021/03/31 Servers
python自动化八大定位元素讲解
2021/07/09 Python
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技