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学习总结-基础架构概述
Apr 05 MySQL
MySQL之高可用集群部署及故障切换实现
Apr 22 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 MySQL
sql注入教程之类型以及提交注入
Aug 02 MySQL
SQL 聚合、分组和排序
Nov 11 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
MySQL多表查询机制
Mar 17 MySQL
分享MySQL常用 内核 Debug 几种常见方法
Mar 17 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
pt-archiver 主键自增
Apr 26 MySQL
Mysql数据库group by原理详解
Jul 07 MySQL
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
Sep 23 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开发中的中文编码问题
2013/08/08 PHP
WordPress主题制作中自定义头部的相关PHP函数解析
2016/01/08 PHP
Yii2框架视图(View)操作及Layout的使用方法分析
2019/05/27 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
JavaScript修改css样式style
2008/04/15 Javascript
WEB前端开发都应知道的jquery小技巧及jquery三个简写
2015/11/15 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
python3.6连接MySQL和表的创建与删除实例代码
2017/12/28 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
2019/04/16 Python
Python 虚拟空间的使用代码详解
2019/06/10 Python
Django 源码WSGI剖析过程详解
2019/08/05 Python
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
购买瑞典当代设计的腕表和太阳眼镜:TRIWA
2016/10/30 全球购物
伦敦新晋轻奢耳饰潮牌:Tada & Toy
2020/05/25 全球购物
市场部规章制度
2014/01/24 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
教师节促销方案
2014/03/22 职场文书
捐书活动总结
2014/05/04 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
婚内分居协议书范文
2014/11/26 职场文书
承诺书范本
2015/01/21 职场文书
义诊活动总结
2015/02/04 职场文书
投诉信格式范文
2015/07/02 职场文书
MySQL 8.0 之不可见列的基本操作
2021/05/20 MySQL
24年收藏2000多部退役军用电台
2022/02/18 无线电
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS