1、什么是索引?

索引:存储引擎用于快速找到记录的一种数据结构,默认使用B-Tree索引。索引是存储引擎层中实现。简单理解为:排好序的快速查找数据结构

索引的目的:提高数据查询的效率,优化查询性能,就像书的目录一样。

优势:提高检索效率,降低IO成本;排好序的表,降低CPU的消耗

劣势:索引实际也是一张表,该表保存了主键与索引字段,并指向实体表的记录,占用空间;降低更新表的速度(改数据表本身,也需要修改索引);花时间研究建立最优秀的索引

索引的常见模型:哈希表、有序数组、搜索树。

InnoDB的索引模型:在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。InnoDB使用的是B+Tree 索引模型,所以数据都是存储在B+Tree树中的。

 

B-Tree索引通常意味着所有的值都是按顺序存储的,并且每一个叶子页到根的距离相同。

 检索原理:

【如图】

一颗B+树,主要分为3个基本模块:磁盘块、数据项、指针。

真实的数据存在于叶子节点,非叶子节点不存储真实的数据,只存储指引搜索方向的数据项。

【查找过程】

如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次IO,在内存中用二分法查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相对磁盘),可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘加载到内存,发生第二次IO,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次IO,同时内存中做二分查找找到29,结束查询,总计三次IO.

Ps:3层的B+树可以表示上百万的数据。

前提:假设一张表,有10W条数据,其中有一条数据是nickname=‘css’,查询这条数据sql:select * from table_award where nickname='css'

没有索引:mysql全表扫描及扫描10W条数据找这条数据

有索引:  建立nickname字段索引,mysql只需要扫描这条nickname='css'的数据

 1.1 索引分类

索引主要包含5个部分:主索引、唯一索引、普通索引、全文索引、复合索引、单字段索引。其中主索引指主键自动的为主索引。

1.2 索引语法

建立索引:
CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name [(length)] [ASC | DESC] , …..);
ALTER TABLE table_name ADD INDEX [index_name] (index_col_name,...) 删除索引
DROP INDEX index_name ON tbl_name;
ALTER TABLE table_name DROP INDEX index_name; 查询索引:
SHOW INDEX FROM table_name;
SHOW KEYS FROM table_name;
DESC table_Name;

索引的分类、语法用文字的形式看起来已经麻木了,可以参考图文:索引分类为5个部分,索引操作语法3种(新增、删除、查询)。

1.3 使用索引

提高性能优化的索引:覆盖索引、最左前缀索引、索引下推。

覆盖索引:可以减少树的搜索次数,显著提高查询性能。

使用索引,查看匹配度, 查询要使用索引最重要的条件是查询条件中需要使用索引。

MATCH (col1,col2,...) AGAINST (expr).

Ex:select match(col_name) against(‘poverty’)from news;

下列几种情况下有可能使用到索引:

1,对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
2,对于使用like的查询,后面如果是常量并且只有%不在第一个字符,索引才可能被使用。
3,如果使用column_name is null将使用索引

下列几种情况不适合建立索引:

1,表记录太小

2,经常增删改的表

3,数据重复且分布平均的表字段

4,如果条件中有or,即使其中有条件有索引也不会使用。

5,对于多列索引,不是使用的第一部分,则不会使用索引。

6,like查询是以%开头

7,如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。

8,如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

下列几种情况适合添加索引:

1,主键自动建立唯一索引

2,频繁作为查询条件的字段应该建立索引

3,查询中与其他表关联的字段,外键关系建立索引

4,频繁更新的字段不适合创建索引-更新表的同时,同步更新索引

5,Where条件里用不到的字段不创建索引

6,单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)

7,查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

8,查询中统计或者分组字段

索引失效:

1、全值匹配

2、最佳左前缀法则

3、不在索引列上做任何操作

4、存储引擎不能使用索引中范围条件右边的列

5、尽量使用覆盖索引,减少select *

6、mysql在使用不等于的时候无法使用索引会导致全表索引

7、Is null,is not null也无法使用索引

8、Like以通配符开头(‘%abc...’)mysql索引失效会变成全表扫描的操作

9、字符串不加单引号索引失效少用or,用它来连接时会索引失效

1.4 查看索引的使用情况

查看索引的使用情况
show status like ‘Handler_read%’;

大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询低效。这是因为我们前面没有加索引的时候,做过多次查询的原因.

MySQL-索引分类及使用索引的更多相关文章

  1. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  2. SQL优化 MySQL版 - 索引分类、创建方式、删除索引、查看索引、SQL性能问题

    SQL优化 MySQL版  - 索引分类.创建方式.删除索引.查看索引.SQL性能问题 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 索引分类 单值索引 单的意思就是单列的值,比如说有 ...

  3. MySQL索引介绍+索引的存储类型+索引的优点和缺点+索引的分类+删除索引

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

  4. mysql 索引分类以及用途分析

    MySQL索引分为普通索引.唯一性索引.全文索引.单列索引.多列索引等等.这里将为大家介绍着几种索引各自的用途. 一. MySQL: 索引以B树格式保存 Memory存储引擎可以选择Hash或BTre ...

  5. mysql索引分类

    mysql索引分类 一.总结 一句话总结: 主键索引:设定为主键后数据库会自动建立索引,innodb为聚簇索引 单值索引:一个索引只包含单个列,一个表可以有多个单列索引:CREATE INDEX id ...

  6. mysql索引分类及实现原理

    索引分类:主键索引.唯一索引.普通索引.全文索引.组合索引 1.主键索引:即主索引,根据主键pk_clolum(length)建立索引,不允许重复,不允许空值 ALTER TABLE 'table_n ...

  7. MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序

    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序   What's Index ? 索引就是帮助RDBMS高效获取数据的数据结构. 索引可以让我们避免一行一行进行全表扫描.它的 ...

  8. Mysql高级操作学习笔记:索引结构、树的区别、索引优缺点、创建索引原则(我们对哪种数据创建索引)、索引分类、Sql性能分析、索引使用、索引失效、索引设计原则

    Mysql高级操作 索引概述: 索引是高效获取数据的数据结构 索引结构: B+Tree() Hash(不支持范围查询,精准匹配效率极高) 树的区别: 二叉树:可能产生不平衡,顺序数据可能会出现链表结构 ...

  9. MySQL索引分类及相关概念辨析

    本文链接:https://www.cnblogs.com/ibigboy/p/16198243.html 之前的一篇<MySQL索引底层数据结构及原理深入分析>很受读者欢迎,成功地帮大家揭 ...

  10. mysql 索引分类

    在数据库表中,对字段建立索引可以大大提高查询速度.通过善用这些索引,可以令 MySQL的查询和运行更加高效.索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常 ...

随机推荐

  1. python文档自译:os模块-01【说明部分】

    15.1. os - Miscellaneous operating system interfaces This module provides a portable way of using op ...

  2. JS函数命名规范

    语法规范: 任何合法的javascript标识符都可以作为函数的名称. 约定俗成的内容:(非ECMAScript语法,但是为了便于开发者理解和识别,约定的函数命名规范.) 命名方法: 小驼峰式命名法 ...

  3. 一看就懂的MySQL的FreeList机制

    Hi,大家好!我是白日梦! 今天我要跟你分享的MySQL话题是:"了解InnoDB的FreeList吗?谈谈看!" 本文是MySQL专题的第 7 篇,共110篇. 一.回顾 前面几 ...

  4. 应对告警风暴,Cloud Alert 实现告警风暴智能降噪

    前言 睿象云前段时间发表了一篇< Zabbix 实现电话.邮件.微信告警通知的实践分享>的技术文章.它帮助我们非常轻松地支持了各种告警通知方式,但是存在一个严重的问题,我们经常接到各种相类 ...

  5. 使用KepServerEx进行数据模拟

    KepServerEx是一款在工业控制中比较常见的数据采集服务软件之一,提供了多种类型的驱动,具有比较广泛的适用性.很多厂商和个人都会选择用它来做OPCServer.在项目的实施或测试过程中,我们有时 ...

  6. linux 进程间通信 共享内存 shmat

    系统调用mmap()通过映射一个普通文件实现共享内存.系统V则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件(这是通过shm ...

  7. CCF-201512-消除类游戏

    问题描述 试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游 ...

  8. mysql调优从书写sql开始

    理论知识 MySQL 的运行机制 Mysql 的SQL关键字执行顺序 1.MySQL 的优化方案有哪些? MySQL 数据库常见的优化手段分为三个层面:SQL 和索引优化.数据库结构优化.系统硬件优化 ...

  9. 新建Chrome标签页,极简+自用

    [跳转GitHub] chromeNewTab 已经入坑Chrome应用开发者,可以去:[应用商店地址]直接添加使用. 使用说明 下载chrome的一个[window组策略文件],解压文件后找到(\p ...

  10. webug第十五关:什么?图片上传不了?

    第十五关:什么?图片上传不了? 直接上传php一句话失败,将content type改为图片 成功