MySQL系列:索引基本操作(4)
1. 索引简介
索引是一种特殊的数据库结构,可以用来快速查询数据中的特定记录。
MySQL中索引包括:普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
1.1 索引定义
索引由数据库表中一列或多列组合而成,作用是提高对表中数据的查询速度。
索引是创建在表是的,对数据表中一列或多列的值进行排序的一种结构。
MySQL索引包含两种存储类型:BTREE索引和HASH索引。InnoDB和MyISAM存储引擎支持BTREE索引,MEMORY存储引擎支持HASH索引和BTREE索引,默认为HASH索引。
索引的优点:可以提高检索数据的速度。
索引的缺点:创建和维护索引需要耗费时间,耗费的时间随数据量增加而增加;
索引需要占用物理空间,每一个索引要占一定的物理空间;
增加、删除和修改数据时,要动态维护索引,降低数据维护速度。
索引可以提高查询的速度,但会影响插入记录的速度。向有索引的表中插入记录时,数据库系统会按照索引进行排序。
插入大量记录时,最好的办法是先删除表中的索引,再插入数据,插入完成后,再创建索引。
1.2 索引分类
MySQL中索引包括:普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。
1>. 普通索引
在创建普通索引时,不附加任何限制条件。
2>. 唯一性索引
使用UNIQUE设置唯一性索引。在创建唯一性索引时,限制该索引的值必须是唯一的。
唯一性索引,可以更快地确定某条记录。
主键是一种特殊的唯一性索引。
3>. 全文索引
使用FULLTEXT设置索引为全文索引。全文索引只能创建在CHAR、VARCHAR或TEXT类型的字段上。
查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。
只有MyISAM存储引擎支持全文索引。
4>. 单列索引
1.3 索引设计原则
(1)索引并非越多越好,一个表中如有大量的索引,占用磁盘空间,影响INSERT、UPDATE、DELETE等语句性能。
(2)避免对经常更新的表进行过多的索引,索引中的列尽可能少。
(3)数据量小的表最好不要使用索引。
(4)在条件表达式中经常用到的不同值较多的列上创建索引,在不同值较少的列上不要创建索引。如:性别字段只有“男”和“女”两个不同值,无须创建索引。
(5)当唯一性是某种数据本身的特征时,指定唯一索引。
(6)在频繁排序或分组的列上创建索引,如果待排序的列有多个,可以创建组合索引。
2. 创建索引
2.1 创建表的时候创建索引
创建表时创建索引的基本语法格式:
CREATE TABLE table_name [col_name data_type]
[UNIQUE] [INDEX | KEY] [index_name] (col_name[length]) [ASC | DESC]
其中,INDEX与KEY为同义词,两者作用相同,用来指定创建索引。
(1)创建普通索引
mysql> CREATE TABLE product
-> (
-> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> product_no VARCHAR(255) NOT NULL DEFAULT '',
-> product_name VARCHAR(255) NOT NULL DEFAULT '',
-> KEY idx_product_no(product_no)
-> );
mysql> SHOW CREATE TABLE product;
+---------+----------------------------------------------------+
| Table | Create Table |
+---------+----------------------------------------------------+
| product | CREATE TABLE `product` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`product_no` varchar(255) NOT NULL DEFAULT '',
`product_name` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_product_no` (`product_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------+----------------------------------------------------+
(2)创建唯一索引
mysql> CREATE TABLE product
-> (
-> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> product_no VARCHAR(255) NOT NULL DEFAULT '',
-> product_name VARCHAR(255) NOT NULL DEFAULT '',
-> UNIQUE KEY idx_product_no(product_no)
-> );
(3)创建组合索引
mysql> CREATE TABLE product
-> (
-> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
-> product_no VARCHAR(255) NOT NULL DEFAULT '',
-> product_name VARCHAR(255) NOT NULL DEFAULT '',
-> KEY idx_product_no_name(product_no, product_name)
-> );
组合索引遵从最左前缀:从索引最左边的列进行匹配。
2.2 查看表上的索引
语法格式:
SHOW INDEX FROM table_name
mysql> SHOW INDEX FROM product;

其中,主要参数:
Table:创建索引的表
Non_unique:索引非唯一,1表示非唯一索引,0表示唯一索引
Key_name:索引名称
Seq_in_index:该字段在索引中的位置,单列索引该值为1,组合索引为每个字段在索引定义中的顺序
Column_name:定义索引的列字段
2.3 在已存在的表上创建索引
(1)使用ALTER TABLE创建索引
ALTER TABLE table_name ADD [UNIQUE] [INDEX | KEY] [index_name] (col_name[length]) [ASC | DESC]
mysql> ALTER TABLE product ADD INDEX idx_product_no(product_no ASC);
(2)使用CREATE INDEX创建索引
CREATE [UNIQUE] [INDEX | KEY] [index_name] ON table_name(col_name[length]) [ASC | DESC]
2.4 删除索引
(1)使用ALTER TABLE删除索引
ALTER TABLE table_name DROP INDEX index_name;
mysql> ALTER TABLE product DROP INDEX idx_product_no;
(2)使用DROP INDEX语句删除索引
mysql> DROP INDEX index_name on table_name;
mysql> DROP INDEX idx_product_no on product;
MySQL系列:索引基本操作(4)的更多相关文章
- MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- MySQL系列(三)---索引
MySQL系列(三)---索引 前言:如果有疏忽或理解不当的地方,请指正. 目录 MySQL系列(一):基础知识大总结 MySQL系列(二):MySQL事务 MySQL系列(三):索引 什么是索引 如 ...
- MySQL系列-优化之like关键字 创建索引
原文: https://blog.csdn.net/ufo___/article/details/81164996 MySQL系列-优化之覆盖索引: https://blog.csdn.net/UF ...
- MySQL系列(九)--InnoDB索引原理
InnoDB在MySQL5.6版本后作为默认存储引擎,也是我们大部分场景要使用的,而InnoDB索引通过B+树实现,叫做B-tree索引.我们默认创建的 索引就是B-tree索引,所以理解B-tree ...
- 如何选择普通索引和唯一索引《死磕MySQL系列 五》
系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...
- 五分钟,让你明白MySQL是怎么选择索引《死磕MySQL系列 六》
系列文章 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强人"锁"难<死磕MySQL系列 三> 四.S 锁与 X 锁的 ...
- 字符串可以这样加索引,你知吗?《死磕MySQL系列 七》
系列文章 三.MySQL强人"锁"难<死磕MySQL系列 三> 四.S 锁与 X 锁的爱恨情仇<死磕MySQL系列 四> 五.如何选择普通索引和唯一索引&l ...
- 为什么MySQL字符串不加引号索引失效?《死磕MySQL系列 十一》
群里一个小伙伴在问为什么MySQL字符串不加单引号会导致索引失效,这个问题估计很多人都知道答案.没错,是因为MySQL内部进行了隐式转换. 本期文章就聊聊什么是隐式转换,为什么会发生隐式转换. 系列文 ...
- Mysql系列(十二)—— 索引下推优化
索引条件下推(ICP)是对MySQL使用索引从表中检索行的情况的优化.如果没有ICP,存储引擎会遍历索引以查找基表中的行,并将它们返回给MySQL服务器,该服务器会评估WHERE行的条件.启用ICP后 ...
随机推荐
- CF369E Valera and Queries
嘟嘟嘟 这题刚开始以为是一个简单题,后来越想越不对劲,然后就卡住了. 瞅了一眼网上的题解(真的只瞅了一眼),几个大字令人为之一振:正难则反! 没错,把点看成区间,比如2, 5, 6, 9就是[1, 1 ...
- maven tomcat jstl 异常
在跑一个带jstl的例子的时候,遇到了这样一个错误: org.springframework.web.util.NestedServletException: Handler processing f ...
- node.js如何引用其它js文件
以Java来说,比如要实现第三方存储,我可能需要导入对应的库,以maven为例,使用腾讯云或者七牛云.阿里云,我需要导入对应的maven依赖.再比如,有些时候我们封装某个类,而那个类不在该包下,我们需 ...
- Flask 框架 重定向,捕获异常,钩子方法及使用jsonify在网页返回json数据
Flask 框架中常用到重定向方法来实现路由的跳转 ,路由跳转又分为站内跳转和站外跳转 常用的站内跳转方法为url_for 而常用的站外跳转为redirect 在这里提示一下: 在使用两种方法是须调 ...
- 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(数据库简单说明)
1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(视频总揽) 这里有个教程 http://www.cnblogs.com/best/p/6517755.h ...
- 生产者消费者 ProducerConsumer
生产者消费者是常见的同步问题.一个队列,头部生产数据,尾部消费数据,队列的长度为固定值.当生产的速度大于消费的速度时,队列逐渐会填满,这时就会阻塞住.当尾部消费了数据之后,生产者就可以继续生产了. 生 ...
- web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。
本篇以我自己的网站为例来通俗易懂的讲述网站的常见漏洞,如何防止网站被入侵,如何让网站更安全. 要想足够安全,首先得知道其中的道理. 本文例子通俗易懂,主要讲述了 各种漏洞 的原理及防护,相比网上其它的 ...
- [WPF]何如在Win7使用Aero2主题
1. 问题 假设我在Windows10的环境新建一个4.6的WPF项目,添加一个ComboBox,并用Blend在这个ComboBox上右键"编辑模板"->"编辑副 ...
- 如何利用snmp协议发现大型复杂环境的网络拓扑
参考文献:http://blog.51cto.com/13769225/2121431 获取指标参考下图: 1.取接口描述(指定VLAN号) 命令:snmpwalk -v 2c -c Cvicse12 ...
- python爬虫随笔-scrapy框架(1)——scrapy框架的安装和结构介绍
scrapy框架简介 Scrapy,Python开发的一个快速.高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试 ...