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的 ...
随机推荐
- 【Git】四、本地Git的工作原理
一.工作区 第一篇创建版本库讲的有些笼统,这里详细区分一下各个概念 在第一篇我们创建了一个文件夹GitRepo,但其实这个文件夹本身并不是版本库,只是我们的工作区.我们所有的文件创建和修改都在这里执行 ...
- Delphi 数组特性
- 万能模拟器eve-ng介绍
作为一名网络工程师,通过模拟器来搭建实验环境是必不可少的,主流的网络模拟器有如下几款:Packet Tracer是思科公司出的一款模拟器,只能模拟思科自己的设备,由于此款软件是纯软件模拟,所以思科设备 ...
- 了解认识asp.net运行机制
asp.net 运行机制 下面了解认识httpModule 要创建一个httpModule类 using System;using System.Collections.Generic;using ...
- php-fpm优化内存占用大
1.1 Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题 LNMP架构中PHP是运行在FastCGI模式下,按照官方的说法,php-cgi会在每个请求结束的时候会回收脚 ...
- 关于pycharm database查看db.sqlites文件提示:Driver class 'org.sqlite.JDBC' not found
系统重新安装后,启动pycharm存在各种问题,其中一个问题就是在Pycharm中的database里面不能查看sqlite数据库了: 经过一番查找终于找到了问题: 首先问题 是提示这样一个报错: 解 ...
- [CodeForces 160A] Twins
题目链接:http://codeforces.com/problemset/problem/160/A 注意排序是从大到小排,不要上来就sort导致从小到大排,细节水题. AC代码: #include ...
- java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)
java 中操作字符串都有哪些类?(未完成)它们之间有什么区别?(未完成)
- scala学习(4)---Array定长数组操作
ScalaArrayNote: https://www.jianshu.com/p/d906f00c05bf
- [ZJOI2019]语言——树剖+树上差分+线段树合并
原题链接戳这儿 SOLUTION 考虑一种非常\(naive\)的统计方法,就是对于每一个点\(u\),我们维护它能到达的点集\(S_u\),最后答案就是\(\frac{\sum\limits_{i= ...