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 06 MySQL
MySQL 表空间碎片的概念及相关问题解决
May 07 MySQL
MySQL主从搭建(多主一从)的实现思路与步骤
May 13 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
MySQL系列之十四 MySQL的高可用实现
Jul 02 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
Centos7中MySQL数据库使用mysqldump进行每日自动备份的编写
Aug 02 MySQL
浅谈MySQL表空间回收的正确姿势
Oct 05 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
MySQL的索引你了解吗
Mar 13 MySQL
MySql中的json_extract函数处理json字段详情
Jun 05 MySQL
MySQL添加索引特点及优化问题
Jul 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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
将php数组输出html表格的方法
2014/02/24 PHP
php中define用法实例
2015/07/30 PHP
js function使用心得
2010/05/10 Javascript
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
移动节点的jquery代码
2014/01/13 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
js限制文本框只能输入整数或者带小数点的数字
2015/04/27 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
Node.js + Redis Sorted Set实现任务队列
2016/09/19 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
详解vue.js之绑定class和style的示例代码
2017/08/24 Javascript
vue项目实现github在线预览功能
2018/06/20 Javascript
vue 项目地址去掉 #的方法
2018/10/20 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
python实现电子词典
2020/04/23 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
Python中对数组集进行按行打乱shuffle的方法
2018/11/08 Python
Python docx库用法示例分析
2019/02/16 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
Python hmac模块使用实例解析
2019/12/24 Python
css3实现wifi信号逐渐增强效果实例
2017/08/09 HTML / CSS
Java中compareTo和compare的区别
2016/04/12 面试题
大专生工程监理求职信
2013/10/04 职场文书
爱耳日活动总结
2014/04/30 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
2014年变电站工作总结
2014/12/19 职场文书
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android