今日内容:

1.为什么要有索引

简而言之,索引出现的意义是为了更方便,更快速的查询数据.

什么是索引

  索引在mysql中也叫''键''或'key'(primary key unique key,index key),是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响越发重要,减少is次数,加速查询.(其中primary key和unique key,除了有加速查询的效果之外,还有约束的效果,primary key 不为空且唯一,unique key唯一,而index key 只有加速查询的效果,没有约束的效果).

  索引优化应该是对查询性能优化最有效的手段了.索引能够轻松将查询性能提高好几个数量级.

  强调: 一旦为表创建了索引,以后的查询最好先查询索引,再根据索引定位的结果去找数据.

2.索引的原理

  索引的目的就在于提高查询效率,就好比查字典的目录一样,先定位到某一个字母,以此类推.直到找到这个字.

索引的影响:

  1.在表中有大量数据的前提下,创建索引速度会很慢.

  2.在索引创建完毕后,对表的查询性能会大幅度提升,但是写性能会降低.

本质是 : 通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式在锁定数据.

3.聚集索引与辅助索引

在数据库中,B+树的高度一般都在2-4层,这也就是说,查找某一个键值的行记录时最多只需要2到4次IO,这倒不错,因为当前一般的机械硬盘至少可以做100次IO,2-4次的IO以为这查询时间只需要0.02-0.04秒.

数据库中的B+树索引可以分为聚集索引和辅助索引.

聚集索引与辅助索引相同的是,不管是聚集索引还是辅助索引,其内部都是B+树的形式,即高度是平衡的,椰子阶段存放着所有的数据.

不同的是 叶子节点存放的数据是否是一整行的信息.

聚集索引

  1. #InnoDB存储引擎表示索引组织表,即表中数据按照主键顺序存放。而聚集索引(clustered index)就是
    按照每张表的主键构造一棵B+树,同时叶子结点存放的即为整张表的行记录数据,也将聚集索引的叶子结点称
    为数据页。聚集索引的这个特性决定了索引组织表中数据也是索引的一部分。同B+树数据结构一样,每个数据
    页都通过一个双向链表来进行链接。
  2.  
  3. #如果未定义主键,MySQL取第一个唯一索引(unique)而且只含非空列(NOT NULL)作为主键,InnoDB使
    用它作为聚簇索引。
  4. #如果没有这样的列,InnoDB就自己产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚簇索引。
  5. #由于实际的数据页只能按照一棵B+树进行排序,因此每张表只能拥有一个聚集索引。在多少情况下,查询优化
    器倾向于采用聚集索引。因为聚集索引能够在B+树索引的叶子节点上直接找到数据。此外由于定义了数据的逻
    辑顺序,聚集索引能够特别快地访问针对范围值得查询。

  聚集索引的好处之一: 他对主键的排序查找和范围查找速度非常快,叶子结点的数据就是用户所要查询的数据.如果用户需要查找一张表,查询最后的10位用户信息,由于B+树索引是双向链表,所以用户可以快速找到最后一个数据页,并取出10条记录.

  聚集索引的好处之二: 范围查询 ,即如果要查找主键某一范围内的数据,通过叶子节点的上层中间阶段就可以得到页的范围,之后直接读取数据页即可.

辅助索引

  我们在查询的时候,where后面需要些id之外的其他字段名字来进行查询,比如说where name=xx,没法用到主键索引的效率,这是就需要我们添加辅助索引了,给name添加一个辅助索引.

表中除了聚焦索引外其他索引都是辅助索引,与聚焦索引的区别: 辅助索引的叶子结点不包括行记录的全部数据.

mysql索引管理

1.索引的功能就是加速查找

2.mysql中的primary key ,unique ,联合唯一也都是索引,这些索引出了加速查找以外,还有约束的功能.

mysql常用的索引

  1.普通索引: index 加速查找

  2.唯一索引:

    主键索引primary key :加速查找+约束(不能为空,不能重复)

    唯一索引 unique : 加速查找+约束(不能重复)

  3.联合索引:

    primary key (id,name): 联合主键索引

    unique(id,name): 联合唯一索引

    index(id,name) : 联合普通索引

索引的两大类型hash 与btree

  1. 我们可以在创建上述索引的时候,为其指定索引类型,分两类
  2. hash类型索引: 查询单条快,范围查询慢
  3. btree类型的索引:b+树,层数越多,数量指数级增长(我们就用它,因为innodb默认支持他)
  4.  
  5. #不用的储存索引引擎支持的索引类型也不一样
  6. InnoDB 支持事务,支持行级别锁定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  7. MyISAM 不支持事务,支持表级别锁定,支持 B-treeFull-text 等索引,不支持 Hash 索引;
  8. Memory 不支持事务,支持表级别锁定,支持 B-treeHash 等索引,不支持 Full-text 索引;
  9. NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-treeFull-text 等索引;
  10. Archive 不支持事务,支持表级别锁定,不支持 B-treeHashFull-text 等索引;

创建/删除索引的语法

删除索引 :

  语法: drop index 索引名 on 表名;

方法1和方法2 是在创建表的时候插入索引,方法3是创建表之后插入索引

  1. 方法一
  2. create table t1(
  3. id int,
  4. name char,
  5. age int,
  6. sex enum('male','female'),
  7. unique key un_id(id),
  8. index ix_name(name) # index 没有key
  9. );
  10.  
  11. 方法二
  12. create index ix_age(age) on t1(age);
  13.  
  14. 方法三
  15. alter table t1 add index ix_sex(sex);
  16.  
  17. 查看
  18. mysql> show create table t1;
  19. | t1 | CREATE TABLE `t1` (
  20. `id` int(11) DEFAULT NULL,
  21. `name` char(1) DEFAULT NULL,
  22. `age` int(11) DEFAULT NULL,
  23. `sex` enum('male','female') DEFAULT NULL,
  24. UNIQUE KEY `uni_id` (`id`),
  25. KEY `ix_name` (`name`),
  26. KEY `ix_age` (`age`),
  27. KEY `ix_sex` (`sex`)
  28. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

  尽量选择区分度高的列作为索引,区分度公式是count() .表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态,性别字段可能在大数据面前区分度是0,

day039 数据库索引的更多相关文章

  1. 【转】B-树和B+树的应用:数据搜索和数据库索引

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树: ⑴树中每个结点至多有m 棵子树: ⑵若根结点不是叶子 ...

  2. 数据结构 B-树和B+树的应用:数据搜索和数据库索引

    B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点 ...

  3. MySQL数据库索引的4大类型以及相关的索引创建

    以下的文章主要介绍的是MySQL数据库索引类型,其中包括普通索引,唯一索引,主键索引与主键索引,以及对这些索引的实际应用或是创建有一个详细介绍,以下就是文章的主要内容描述. (1)普通索引 这是最基本 ...

  4. 数据库索引B+树

    面试时无意间被问到了这个问题:数据库索引的存储结构一般是B+树,为什么不适用红黑树等普通的二叉树? 经过和同学的讨论,得到如下几个情况: 1. 数据库文件是放在硬盘上,每次读取数据库都需要在磁盘上搜索 ...

  5. B树在数据库索引中的应用剖析

    引言 关于数据库索引,google一个oracle index,mysql index总 有大量的结果,其中很多的使用方法推荐,**索引之n条经典建议云云.笔者认为,较之借鉴,在搞清楚了自己的需求的基 ...

  6. 谈数据库索引和Sqlite中索引的使用

    要使用索引对数据库的数据操作进行优化,那必须明确几个问题:1.什么是索引2.索引的原理3.索引的优缺点4.什么时候需要使用索引,如何使用围绕这几个问题,来探究索引在数据库操作中所起到的作用. 1.数据 ...

  7. mysql的limit性能,数据库索引问题,dblog问题

    mysql的limit性能,数据库索引问题,dblog问题,redis学习 继续学习. dblog实际上是把日志记录在另一个数据库里面. 问题1: 一张表定义了5个索引,但是sql语句中用到了3个有索 ...

  8. B-树和B+树的应用:数据搜索和数据库索引

    B-树和B+树的应用:数据搜索和数据库索引  B-树 1 .B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用. 定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每 ...

  9. SQL Server 数据库索引

    原文:SQL Server 数据库索引 一.什么是索引 减少磁盘I/O和逻辑读次数的最佳方法之一就是使用[索引] 索引允许SQL Server在表中查找数据而不需要扫描整个表. 1.1.索引的好处: ...

随机推荐

  1. Mybatis中resultType理解

  2. Codeforces 551 E - GukiZ and GukiZiana

    E - GukiZ and GukiZiana 思路:分块, 块内二分 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC ...

  3. 日常英语---十一、MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider)

    日常英语---十一.MapleStory/Monsters/Level 201-210(Dark Demon Eagle Rider) 一.总结 一句话总结:骑着鹰的快速飞行的恶魔,进入地图后跟着你. ...

  4. HeadFirst Ruby 第十章总结 Comparable & Enumerable

    导言 这一章的标题是 Ready-Made Mixes, 也就是 Ruby 已经准备好的用于 Mix-in 的 Modules, 它们是: Comparable 和 Enumerable, Compa ...

  5. 20165303 2017-2018-2 《Java程序设计》结对编程练习_四则运算

    需求分析 能生成简单四则运算题目并判断用户回答对错. 能正确统计回答正确的概率. 能正确处理混合四则运算的优先级的问题. 能正确输出负数等结果. 能处理简单的加,减,乘,除运算. 能正确的处理有括号的 ...

  6. 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器

    这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...

  7. 并查集-解决区间和纠错问题 hdu-3038

    题目:多次给出信息,告诉你[a,b]区间的和,求多少个错误信息(错误信息不考虑). 乍一看有点像线段树,但想想就发现这个并不能用线段树方便地解决.后来经提醒是并查集的一种经典题型. 把区间抽象为并查集 ...

  8. PHP单例模式 demo

    <?php class single{ static public $db; private function __construct(){ }; static function getinst ...

  9. 4.1.7 Cutting Game(POJ 2311)

    Problem description: 两个人在玩如下游戏. 准备一张分成 w*h 的格子的长方形纸张,两人轮流切割纸张.要沿着格子的边界切割,水平或者垂直地将纸张切成两部分.切割了n次之后就得到了 ...

  10. ubuntn 安装python3 及 django及pip3

    1.sudo apt-get install python3-pip    安装pip3 2.sudo pip3 install django   通过pip3安装django 3. sudo apt ...