MySQL索引(六)
一、什么是索引
索引就像一本书的目录一样,如果在字段上建立索引,那么以索引为列的查询条件时可以加快查询的速度,这个就是MySQL优化的重要部分
二、创建主键索引
整个表的每一条记录的主键值在表内都是唯一的,用来唯一标识一条记录
查询数据库,按主键查询是最快的,每个表只能有一个主键列,但是可以有多个普通索引列。主键列要求列的所有内容必须唯一,而普通索引列不要求内容必须唯一
无论建立主键索引还是普通的索引,都要在表的对应列上创建,可以对单列创建索引,也可以对多列创建索引
创建主键索引的方法(在创建表的时候)--PRI
create table test1(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id), # 主键索引
key index_name(name)
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 查看主键索引
show index from test; 为创建好的表用sql添加主键(基本上不用)
alter table test change id id int primary key auto_increment; PS:如果主键索引有auto_increment自增参数是不能删除索引的,在工作中主键索引也不可能删除
三、创建普通索引
创建普通索引(创建完表随时会加)--MUL
在创建表的时候
create table test2(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id),
key index_name(name) # 普通索引
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 查看索引
show index from test1; 删除普通索引
alter table test1 drop index index_name;
drop index index_name on test1; 创建表后增加普通索引
alter table test1 add index index_name(name); PS:添加索引的时间取决于表中的数据的大小
四、创建联合索引
一张表的一个字段唯一值不多的情况下,希望创建一个唯一值更少的索引,所以就可以把多个字段联合起来创建索引(字段越多创建联合索引,唯一值就越少)
在创建表的时候加上联合索引
create table test3(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id),
key index_name(name),
key index_name_dept(name,dept) # 联合索引
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 创建联合索引
create index index_name_dept on test(name,dept);
alter table test add index index_name_dept(name,dept); 对字段的前n个字符创建联合索引
create index index_name_dept on test(name(8),dept(10));
alter table test add index index_name_dept(name(8),dept(10)); 删除联合索引
alter table test drop index index_name_dept;
drop index index_name_dept on test; 主键也可以创建联合索引
create table test4(
id int(4) not null auto_increment,
name char(20) not null,
age tinyint(2) not null default '0',
dept varchar(16) default Null,
primary key(id,age), # 主键的联合索引
key index_name(name),
key index_name_dept(name,dept) # 联合索引
)ENGINE=InnoDB DEFAULT CHARSET=utf8; PS:建立索引的原则:我们尽量在唯一值多的大表上建立索引
PS:联合索引的前缀特性
index(a,b,c)仅a,ab,abc三个查询条件会走索引
尽量把最常用的作为查询条件的列,放在第一的位置
五、创建唯一索引(非主键)
创建非主键的唯一索引(相当于和主键类似)--UNI 可以为空
create unique index uni_index_name on test(name); 删除索引
alter table test drop index uni_index_name;
drop index uni_index_name on test; 查看索引
show index from test;
六、给字段的前n个字符创建索引
当一个字段的内容的前N个字符已经接近唯一的时候,我们可以对前n个字符创建索引,这样可以节省创建索引的空间,以及降低读取金和更新维护索引消耗的系统资源
创建前n个字符的索引
create index index_dept on test(dept(8));
alter table test add index index_dept(dept(8)); 删除索引
alter table test drop index index_dept;
drop index index_dept on test; 查看索引
show index from test;
七、关于索引的问题
既然索引可以加快查询的速度,那么就可以给所有的列加上索引吧?
因为索引不但占用系统空间,而且更新数据时还需要维护索引数据,因此索引是双刃剑,并不是越多越好,如:数十到几百行的小表上无需创建索引,更新频繁,读取比较少的表要少建索引 需要在哪些列上创建索引呢?
select user from mysql.user where host='' 索引一定要创建在where后的条件列上,如果是连表查询要创建在连接的列上,而不是创建在select后选择数据的列上,另外我们要尽量选择在唯一值多的大表上的列创建索引
八、索引的总结
创建索引的基本知识小结:
1、 索引类似书籍的目录,会加快查询数据的速度。
2、 要在表的列(字段)上创建索引。
3、 索引会加快查询速度,但是也会会影响更新的速度,因为更新要维护索引数据。
4、 索引列并不是越多越好,要在频繁查询的表语句where后的条件列上创建索引。
5、 小表或重复值很多的列上可以不建索引,要在大表以及重复值少的条件列上创建索引.
6、 多个列联合索引有前缀生效特性。
7、 当字段内容前N个字符己经接近唯一时,可以对字段的前N个字符创建索引。
8、 索引从工作方式区分,有主键,唯一,普通索引。
9、 索引类型会有BTREE (默认)和hash (适合做缓存(内存数据库)等
MySQL索引(六)的更多相关文章
- mysql进阶(二十六)MySQL 索引类型(初学者必看)
mysql进阶(二十六)MySQL 索引类型(初学者必看) 索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型. 在数 ...
- mysql第六篇 : MySQL索引原理与慢查询优化
浏览目录 一.索引介绍 二.索引方法 三.索引类型 四.聚合索引和辅助索引 五.测试索引 六.正确使用索引 七.组合索引 八.注意事项 九.查询计划 十.慢日志查询 十一.大数据量分页优化 一.索引介 ...
- 关于MySQL索引面试题的六连炮!招架的住吗?
1.面试真题 MySQ索引的原理和数据结构能介绍一下吗? b+树和b-树有什么区别? MySQL聚簇索引和非聚簇索引的区别是什么? 他们分别是如何存储的? 使用MySQL索引都有哪些原则? MySQL ...
- 五分钟,让你明白MySQL是怎么选择索引《死磕MySQL系列 六》
系列文章 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强人"锁"难<死磕MySQL系列 三> 四.S 锁与 X 锁的 ...
- MYSQL索引结构原理、性能分析与优化
[转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...
- 【转】MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- [转]MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- MySQL索引类型总结和使用技巧以及注意事项
索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...
- MySQL索引背后的数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
随机推荐
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- 2018.07.06 洛谷P2936 [USACO09JAN]全流Total Flow(最大流)
P2936 [USACO09JAN]全流Total Flow 题目描述 Farmer John always wants his cows to have enough water and thus ...
- (转)code first基础
转自:http://tech.it168.com/a2011/0719/1220/000001220362_all.shtml [IT168 技术]随着.NET 4.0时代的到来,开发者越来越关注如何 ...
- 图形与游戏中3D数学基础的说明
1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系:传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系 坐标系由坐标轴与坐标原点组成.原点定义坐标系 ...
- hdu 5036 概率+bitset
http://acm.hdu.edu.cn/showproblem.php?pid=5036 n个房间每个房间里面有一把或多把钥匙可以打开其他的门.如果手上没有钥匙可以选择等概率随机选择一个门炸开,求 ...
- jsp ckeditor ckfinder
我认为对的事情,有可能是完全错的. 这篇教程很好: http://www.cnblogs.com/yuepeng/archive/2013/04/01/2992097.html 只看到9,权限控制还没 ...
- Ansible配置文件
官方配置文件文档 Ansible安装完成之后默认配置文件为:/etc/asnible/ansible.cfg Ansible配置文件内容: cat ansible.cfg # config file ...
- <context:component-scan>自动扫描
主要讲解自动扫描的<context:component-scan>中的2个子标签的使用方法 在Spring MVC中的配置中一般会遇到这两个标签,作为<context:compone ...
- SSH登录警告(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)
在配置本机与docker容器实现ssh无密码访问时出现以下报错 # federico @ linux in ~ [18:35:52] C:127$ sudo ssh-copy-id -i .ssh/i ...
- 使用SignalR 2进行服务器广播
概述 在本教程中,您将创建一个股票代码应用程序,该应用程序代表您希望定期“推送”或广播从服务器到所有连接客户端的通知的实时应用程序.在本教程的第一部分中,您将从头开始创建该应用程序的简化版本.在本教程 ...