06 MySQL之索引
01-索引
1、索引是对数据库表中一列或多列的值进行排序的一种数据结构,使用索引可提高数据库中特定数据的查询速度。 2、索引是一个单独的、存储在磁盘上的数据库结构,包含对数据表里所有记录的引用指针。 3、使用索引用于快速找出某个或多个列中有一特定值的行,所有的MySQL列类型都可以被索引,对相关列使用索引是提高查询操作速度的最佳途径。 4、索引是在存储引擎中实现的。因此,每种存储引擎的索引都不一定完全相同,并且每种存储引擎也不一定支持所有索引类型。
根据存储引擎定义每个表的最大索引数和最大索引长度。所有的存储引擎支持每个表至少16个索引,总索引长度至少为256字节。 5、MySQL中索引的存储类型有两种:BTREE 和 HASH,具体和表的存储引擎相关; 6、MyISAM和InnoDB存储引擎只支持BTREE索引;MEMORY/HEAY存储引擎可以支持HASH和BTREE索引。 7、索引的优点:
(1)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性。
(2)可以大大加快数据的查询速度,这也是创建索引的最主要的原因。
(3)在实现数据的参考完整性方面,可以加速表和表之间的连接。
(4)在使用分组和排序子句进行数据查询时,也可以显著减少查询中分组和排序的时间。 8、增加索引有如下不利方面:
(1)创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
(2)索引需要占磁盘空间,除了数据表站数据文件空间之外,每一个索引还要占一定的物理空间,如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低数据的维护速度。
02-索引的分类
MySQL的索引可以分为一下几类:
1、普通索引和唯一索引
普通索引是MySQL中的基本索引类型,允许在定义索引的列中插入重复值和空值。
唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
主键索引是一种特殊的唯一索引,不允许有空值。 2、单列索引和组合索引
单列索引即一个索引只包含单个列,一个表可以有多个单列索引。
组合索引指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用。使用组合索引时,遵循最左前缀集合。 3、全文索引
全文索引类型为 FULLTEXT,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引可以在 CHAR、VARCHAR、TEXT类型的列上创建。MySQL中只有MyISAM存储引擎支持全文索引。 4、空间索引
空间索引是对空间数据类型的字段建立索引,MySQL中的空间数据类型有4种,分别是:GEOMETRY、POINT、LINESTRING 和 POLYGON。
MySQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类似的语法创建空间索引。
创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MyISAM的表中创建。
03-索引的设计原则
设计索引时,应该考虑一下准则:
(1)索引并非越多越好,一个表中如有大量的索引,步进占用次哦按空间,而且会影响INSERT、DELETE、UPDATE等语句的性能,因为当表中的数据更改的同时,索引也会进行调整和更新。
(2)避免对经常更新的表进行过多的索引,并且索引中的列尽可能减少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
(3)数据量小的表最好不要使用索引,由于数据较少,查询话费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
(4)在条件表达式中经常用到的不同值较多的列上创建索引,在不同值很少的列上不要建立索引。
(5)当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引需能确保定义的列数据完整性,以提高查询速度。
(6)在频繁进行排序或分组的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
04-创建索引
创建表的时候创建索引
# 1、创建表的时候创建索引
使用 CREATE TABLE 创建表时,除了可以定义列的数据类型,还可以定义主键约束,外键约束 或者 唯一性约束,而不论创建哪种约束,在定义约束的同时相当于在指定列上创建了一个索引。
创建表时创建索引的基本语法格式如下:
CREATE TABLE table_name [col_name data_type] [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name [length]) [ASC|DESC] 参数含义:
UNIQUE、FULLTEXT、SPATIAL 分别表示 唯一索引、全文索引、空间索引;
INDEX 与 KEY 两者作用相同,用来指定创建索引;
col_name 为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;
index_name 指定索引的名称,可选参数;默认col_name 为索引值。
length 为可选参数,表示索引的长度,只有字符串类型才能指定索引长度。 # 2、创建普通索引
最基本的索引类型,没有唯一性之类的限制,其作用只是加快对数据的访问速度。
例:
CREATE TABLE book (
bookid INT NOT NULL,
bookname VARCHAR(255) NOT NULL,
info VARCHAR(255) NULL,
year_publication YEAR NOT NULL,
INDEX(year_publication)
); # 3、创建唯一索引
创建唯一索引的主要原因是减少查询索引列操作的执行时间,尤其是对比较庞大的数据表。索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
例:
CREATE TABLE t1 (
id INT NOT NULL,
name VARCHAR(255) NOT NULL,
UNIQUE INDEX UniqIdx(id)
); # 4、创建单列索引
单列索引是在数据表中的某一个字段上创建的索引,一个表中可以创建多个单列索引。上面两个例子都是单列索引。 # 5、创建组合索引
组合索引是在多个字段上创建一个索引。
例:
CREATE TABLE t2 (
id INT NOT NULL,
name CHAR(20) NOT NULL,
age INT NOT NULL,
INDEX MulaiIdx(id, name)
); # 6、创建全文索引
FULLTEXT 可以用于全文搜索,只有MyISAM存储引擎支持,并且只为CHAR、VARCHAR、TEXT列创建索引。
索引总是对整个列进行,不支持局部(前缀)索引。
例:
CREATE TABLE t3 (
id INT NOT NULL,
name CHAR(20) NOT NULL,
age INT NOT NULL,
info VARCHAR(255),
FULLTEXT INDEX FullTextIdx(info)
) ENGINE=MyISAM; # 7、创建空间索引
空间索引必须在MyISAM类型的表中创建,且空间类型的字段必须为非空。
例:
CREATE TABLE t4 (
id INT NOT NULL,
g GEOMETRY NOT NULL,
SPATIAL INDEX spatIdx(g)
) ENGINE=MyISAM;
注意:创建时指定空间类型字段值的非空约束,并且表的存储引擎为MyISAM。
在已经存在的表上创建索引
# 1、使用ALTER TABLE 语句创建索引
基本语法如下:
ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (col_name[length], ...) [ASC|DESC]
查看表的索引:
show index from book\G; 例:
ALTER TABLE book ADD INDEX BkNameIdx(bookname(30)); # 2、使用CREATE INDEX 创建索引
可以在已经存在的表上添加索引。
基本的语法结构:
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (col_name[length], ...) [ASC|DESC]
05-删除索引
# 1、使用 ALETR TABLE 删除索引的基本语法格式如下:
ALTER TABLE table_name DROP INDEX index_name;
注意:AUTO_INCREMENT 约束字段的唯一索引不能删除。 # 2、使用 DROP INDEX 语句删除索引
DROP INDEX index_name ON table_name; 注意:删除表中的列时,如果要删除的列为索引的组成部分,则该列也会从索引中删除。如果组成索引的所有列都被删除,则整个索引将被删除。
06 MySQL之索引的更多相关文章
- 【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引
本文地址 分享提纲: 1.为查询缓存优化你的查询 2. EXPLAIN 你的 SELECT 查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在Join表的时候使用相当类 ...
- ySQL性能优化的21个最佳实践 和 mysql使用索引
MySQL性能优化的21个最佳实践 和 mysql使用索引 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 ...
- MySQL单列索引和组合索引(联合索引)的区别详解
发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...
- 【转】【备忘录】MySQL性能优化的21个最佳实践 和 mysql使用索引
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...
- MySQL性能优化的21个最佳实践 和 mysql使用索引【转载】
今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...
- MYSQL:基础——索引原理及慢查询优化
MYSQL:基础——索引原理及慢查询优化 索引的数据结构 索引的数据结构是B+树.如下图所示,B+树的节点通常被表示为一组有序的数据项和子指针.图中第一个节点包含数据项3和5,包含三个指针,第一个指针 ...
- mysql 添加索引,ALTER TABLE和CREATE INDEX的区别
nvicat-->mysql表设计-->创建索引. (1)使用ALTER TABLE语句创建索引,其中包括普通索引.UNIQUE索引和PRIMARY KEY索引3种创建索引的格式: PRI ...
- 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器
@ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...
- MySQL中索引和优化的用法总结
1.什么是数据库中的索引?索引有什么作用? 引入索引的目的是为了加快查询速度.如果数据量很大,大的查询要从硬盘加载数据到内存当中. 2.InnoDB中的索引原理是怎么样的? InnoDB是Mysql的 ...
随机推荐
- Spark的Shuffle
0. Shuffle概述 要理解什么是Shuffle,首先介绍大数据与分布式.我们知道大数据的存储是分布式存储,大数据的计算框架是分布式的计算框架.分布式必然存在数据的交互传输,简言之Shuffle就 ...
- Hive正则表达式
正则表达式基本语法 用圆括号将所有选择项括起来,相邻的选择项之间用|分隔.但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用. 其中 ?: 是非捕获元之一,还 ...
- Linux系统上对其他用户隐藏进程的简单方法
mount -o remount,rw,hidepid=2 /proc 我使用的是多用户系统,大部分的用户通过ssh客户端访问他们的资源.我如何(怎么样)避免泄露进程信息给他们?如何(怎么样)在Deb ...
- Training #2 cell battle (BFS)
Constraints: 1 <= R, C <= 500 1 <= T <= 5 Sample Input: 5 3 5 ##### a...b ##### 3 4 #### ...
- PHPStorm 3.3 破解方法 以及汉化
第一步修改host文件(host文件地址为): C:\Windows\System32\drivers\etc 将以下内容添加到host文件里面 0.0.0.0 account.jetbrai ...
- javascript只弹出一次框 再次刷新不弹出
.打开页面自动弹出 当关闭弹框的时候 设置cookie生存时间 再次刷新页面判断cookie是否失效 <html> <head> <meta charset=&qu ...
- python_三元运算符
三元运算又称三目运算,是对简单的条件语句的简写 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成立 else 2 举例: a ...
- 01—mybatis开山篇
什么是 MyBatis ? MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.M ...
- python解决八皇后问题的方法
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/9/11 15:40 # @Author : Lijinjin # @Site ...
- 大数据结构设计V1.0