索引:约束 + 快速查找

索引是数据库中用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。

问:为什么索引可以这么快?[类似书的目录]

答:Mysql默认情况下,扫描一行一行的扫描所有表中的数据,直到遇到我们需要的数据,才结束查询。有了索引之后,Mysql会对我们创建了索引的列单独创建一个文件,同时将表中列中的数据进行一个转换[将name列中的hhh转换为数字],然后按照B+树的顺序排序,也根据B+树查找

MySQL中常见的索引:索引都是唯一的

普通索引 - 加速查找,重复数据重复查找

唯一索引 - 加速查找,约束列数据不能重复,数据可以为null

主键索引 - 加速查找,约束列数据不能重复,数据不能为null

组合索引 - 多列可以创建一个索引文件

注意:索引适用于不常修改的列,仅用于查询操作

普通索引:  加速查找

创建普通索引:

方案一:创建表的时候创建索引

方案二:手动创建

方案一:创建表的时候创建索引

create table tb1(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
index ix_name (name) # 为neme列创建普通索引,普通索引数据可以重复
)engine=innodb default charset='utf8'

方案二:手动创建

create index ix_email on tb1(email) # 为email列创建索引

删除普通索引:
drop index ix_email; 查看普通索引:
show index from tb1;

唯一索引:加速查询 和 唯一约束(可含null)

创建唯一索引:

方案一:创建表的时候创建索引

方案二:手动创建

方案一:创建表的时候创建索引

create table tb2(
nid int not null auto_increment primary key,
name varchar(32) not null,
email varchar(64) not null,
extra text,
unique ix_name (name) # 为neme列创建唯一索引,唯一索引数据不可以重复
)engine=innodb default charset='utf8'

方案二:手动创建

方案二:手动创建
create unique index ix_email on tb2(email) # 为email列创建唯一索引 删除唯一索引:
drop unique index ix_email; 查看唯一索引:
show index from tb2;

主键索引:加快查找、不能重复 和 不能为空

创建主键索引:

方案一:创建表的时候创建索引

方案二:创建表的时候创建索引  --> primary key(nid)

方案三:手动创建,一个表只能有一个主键

方案一:创建表的时候创建索引

create table tb3(
nid int not null auto_increment primary key, # 为nid列创建主键索引,主键索引数据不可以重复, 不可以为null
name varchar(32) not null,
email varchar(64) not null,
extra text,
)engine=innodb default charset='utf8' 

方案二:创建表的时候创建索引  --> primary key(nid)

create table tb3(
nid int not null auto_increment,
name varchar(32) not null,
email varchar(64) not null,
extra text,
primary key (nid) # 为nid列创建主键索引,主键索引数据不可以重复, 不可以为null
)engine=innodb default charset='utf8'

方案三:手动创建,一个表只能有一个主键

alter table tb3 add primary key(email) # 重复会报错, Multiple primary key defined

删除主键索引:
alter table tb3 drop primary key; 查看主键索引:
show index from tb3;

组合索引:多列创建一个索引

- 普通组合索引:   无约束,且遵循最左匹配

- 联合唯一索引:   有约束,两列数据同时不相同,才能插入,不然报错

创建组合索引:

方案一:创建表的时候创建索引

方案二:手动创建

方案一:创建表的时候创建索引

create table tb4(
nid int not null auto_increment primary key,# 为nid列创建主键索引,主键索引数据不可以重复, 不可以为null
name varchar(32) not null,
email varchar(64) not null,
extra text,
index(name, email) # 创建普通组合索引
# unique(name, email) # 创建唯一组合索引
)engine=innodb default charset='utf8'

方案二:手动创建

方案二:手动创建
create index ix_name_email on in4(name,email); # 重复会报错, Multiple primary key defined 删除主键索引:
drop index ix_name_email; 查看主键索引:
show index from tb4;

按照索引查找方式分

覆盖索引 + 合并索引

如何有效的使用索引:

数据库表中添加索引后确实会让查询速度起飞,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。

-- 使用做匹配的like
select * from student where sname like '%hhh' # 不推荐,因为左查找,先匹配%后匹配hhh,匹配范围是All
select * from student where sname like 'hhh%' # 推荐,因为左查找,先匹配cnn,匹配范围是range
-- SQL语句中尽量不要使用函数 -- 类型不一致,导致索引查询失败
select * from tb1 where name = 999;
-- 特别的,Mysql中使用小于,等于的时候默认是使用索引的,但是大于的时候就不走索引了

【更多参见】http://www.cnblogs.com/wupeiqi/articles/5716963.html

Mysql学习---索引的学习 180101的更多相关文章

  1. MySQL索引知识学习笔记

    目录 一.索引的概念 二.索引分类 三.索引用法 四 .索引架构简介 五.索引适用的情况 六.索引不适用的情况 继我的上篇博客:Oracle索引知识学习笔记,再记录一篇MySQL的索引知识学习笔记,本 ...

  2. 小白学习mysql之索引初步

    导语 索引在数据库中的地位是及其的重要,同时要想完全的掌握索引并不是一件容易的事,需要对数据的查询原理以及计算机操作系统有深刻的认识,当然相关的算法和数据结构也是必须的.因此,这篇文章感到了一些压力, ...

  3. Mysql 索引案例学习

    理解索引最好的办法是结合示例,所以这里准备了一个索引的案例. 假设要设计一个在线约会网站,用户信息表有很多列,包裹国家,地区,城市,性别,眼睛颜色,等等.完整必须支持上面这些特征的各种组合来搜索用户, ...

  4. MySQL学习----索引的使用

    一.什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的 ...

  5. MySQL索引的学习

    MySQL索引的学习 关于使用mysql索引的好处,合理的设计并使用mysql索引能够有效地提高查询效率.对于没有索引的表,单表查询可能几十万数据就是平静,在大型网站单日可能会产生几十万甚至几百万的数 ...

  6. 10 | MySQL为什么有时候会选错索引? 学习记录

    <MySQL实战45讲>10 | MySQL为什么有时候会选错索引? 学习记录http://naotu.baidu.com/file/e7c521276650e80fe24584bc9a6 ...

  7. MySQL之InnoDB索引面试学习笔记

    写在前面 想要做好后台开发,终究是绕不过索引这一关的.先问自己一个问题,InnoDB为什么选择B+树作为默认索引结构.本文主要参考MySQL索引背后的数据结构及算法原理和剖析Mysql的InnoDB索 ...

  8. 对mysql锁机制的学习

    1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出” ...

  9. 深挖计算机基础:MySQL实战45讲学习笔记

    参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...

随机推荐

  1. docker最新版本如何自定义配置文件

    1 如果你想使用 /etc/default/docker文件配置你的docker 在 /etc/systemd/system/docker.service.d/docker.conf 添加下面---- ...

  2. Linux-socket使用

    socket 产生的原因 进程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX ...

  3. Elasticsearch集群和索引常用命令

    https://www.cnblogs.com/pilihaotian/p/5846173.html REST API用途 ES提供了很多全面的API,大致可以分成如下几种: 1 检查集群.节点.索引 ...

  4. 设计模式笔记-观察者(Observer)

    观察者设计模式应该是比较简单的一个设计模式. 定义 定义了对象之间的一对多依赖,这样以来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新. 简单理解就是: 当1个对象状态有所改变的时候,依 ...

  5. 第二章:第2章PHP基础语法

    一. 基本的PHP语法如下: 1.PHP脚本可以放在文档中的任何位置,PHP脚本以<?php开始,以?>结束 <?php   //PHP代码 ?> 2.php文件的默认文件扩展 ...

  6. Tomcat源码分析——请求原理分析(下)

    前言 本文继续讲解TOMCAT的请求原理分析,建议朋友们阅读本文时首先阅读过<TOMCAT源码分析——请求原理分析(上)>和<TOMCAT源码分析——请求原理分析(中)>.在& ...

  7. C# 字符串处理—— 去除首位保留其他

    //去除首位 public static string RemoveFirstPlace(string s) { ) //输入空值直接Return { ")) //判断开头是否是零 s = ...

  8. ASP.NET 简单的柱形图实现(附带示例)

    对于一些内部系统的项目,各种图表是在所难免的,因为图表可以更加清晰的表达出想看到的数据. 因为之前从来没有做过关于图表的东西,唯一能想到的就是“验证码”,所以应该是一个思路,用GDI去搞. 数据懒着去 ...

  9. 三、hive JavaAPI示例

    在上文中https://www.cnblogs.com/lay2017/p/9973370.html 我们通过hive shell去操作hive,本文我们以Java代码的示例去对hive执行加载数据和 ...

  10. rgbdslam 源代码的实现

    经过一番努力,终于跑通了felix.endres的rgbd slam v2 源码,中间遇到挺多问题.总结如下: (1) 关于SiftGPU问题:ERROR: SiftGPU cannot be com ...