`

mysql索引详解

 
阅读更多

数据结构分,有B-Tree索引(B+ Tree)、哈希索引、R-Tree索引等。按数据块的顺序和索引节点的逻辑顺序是否一致可以分为聚集索引和非聚集索引。聚集索引由于物理块连续,在范围扫描的时候可以减少磁头寻道时间,因而比非聚集索引高效。

 

几种索引类型的选择:

primary:主键索引。

unique:唯一索引。不允许重复,可以为null。

normal:普通索引。

FULLTEXT:只能对CHAR, VARCHAR和TEXT列编制索引,并且只能在MyISAM表中编制。

SPATIAL:只能对空间列编制索引,并且只能在MyISAM表中编制。

 

个人总结:

       一般使用主键+组合索引,主键是唯一值(一般用id)。组合索引常用于条件查询使用,比如where需要两个字段,或者where+order by。其中,需要注意一条sql只能使用1个索引,也就是,如果where使用了,order by不能和前者满足组合索引左前缀关系,order by就不使用索引index排序而使用filesort了,当然性能也就差了。

       聚集索引中,"聚集"的意思是指实际的数据行和相关的键值都保存在一起,但是每个表只能有一个聚集索引,不能把一行数据保存在两个地方。

MyISAM

1、非聚集索引,所以即使建立主键,也是非聚集的。

2、B+Tree,所有索引的叶节点是数据的物理地址。

3、如果唯一索引不允许存在NULL值,那与主键索引本质上一样。

4、第二(其他)索引,查找数据,找到物理地址,然后从中读取。

InnoDB

1、聚集索引(有且仅有一个),如果有主键,主键就是聚集索引,若没有主键且有唯一索引,第一个唯一索引就是聚集索引,如果都没有,则表自动生成一个6字节的聚集索引来做排序ID。

2、B+Tree,聚集索引的叶节点是完整数据,其他索引叶节点是聚集索引的键值。

3、如果唯一索引不允许存在NULL值,查询却还是需要先找到数据的聚集索引唯一值,再去聚集索引中找对应数据。

4、第二(其他)索引,查找数据,找到后再根据聚集索引唯一值去聚集索引中找对应数据。

 

建议:当索引为字符串,而且字符串又比较长,可以使用前缀索引(即只使用该字段指定长度的部分字符)减少其索引空间,但是这样就不能用于order by和group by了。

对于多表索引:一定要在Join的字段上建立索引,而且该字段类型编码必须一致,才能优化sql。

 

 索引的官方介绍:

        MySQL为表把它的数据词典信息以.frm文件的形式存在数据库目录里,这对所有MySQL存储引擎都是真的。但是每个InnoDB表在表空间内的InnoDB内部数据词典里有它自己的条目。当MySQL移除表或数据库,它不得不删除.frm文件和InnoDB数据词典内的相应条目。这就是为什么你不能在数据库之间简单地移动.frm文件来移动InnoDB表。

        每个InnoDB表有专门索引,被称为clustered index,对行的数据被存于其中。如果你对你的表定义一个PRIMARY KEY,主键的索引是集束索引。

        如果你没有为表定义PRIMARY KEY,MySQL取第一个不允许NOT NULL列的UNIQUE索引作为主键,并且InnoDB把它当作集束索引来用。如果表中没有这样一个索引,InnoDB内部产生一个集束索引,其中用InnoDB在这样一个表内指定给行的行ID来排序行。行ID是一个6字节的域,它在新行被插入的时候单一地增加。因此被行ID排序的行是物理地按照插入顺序排的。

        通过集束索引访问一个行是较快的,因为行数据是在索引搜索引导的同一页面。如果表是巨大的,当对比于传统解决方案,集束索引构架经常节约磁盘I/O。(在许多数据库,数据传统地被存在与索引记录不同的页)。

        在InnoDB中,非集束索引里的记录(也称为第二索引)包含对行的主键值。InnoDB用这个主键值来从集束索引中搜索行。注意,如果主键是长的,第二索引使用更多空间。

InnoDB比较CHAR和VARCHAR字符串不同长度,以便在较短字符串中剩下的长度被处理视为用空格补上的。

 

15.2.13.1. 索引的物理结构

        所有InnoDB的索引是B数,其中索引记录被存储在树的树叶页。一个索引页的默认大小是16KB。当新记录被插入,InnoDB试着为将来索引记录的插入和更新留下十六分之一的空白页。

        如果索引记录以连续的顺序被插入(升序或者降序),结果索引页大约是15/16满。如果记录被以随机的顺序被插入,页面是从1/2到 15/16满。如果索引页的填充因子降到低于1/2,InnoDB试着搜索索引树来释放页。

分享到:
评论

相关推荐

    MySql索引详解,索引可以大大提高MySql的检索速度

    打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车拿汉语字典的目录页(索引)打比方,我们可以按拼音、笔画、偏旁部首等排序的目录(索引)快速查找到...

    MySQL Innodb 索引原理详解

    ### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...

    mysql数据库以及索引详解.pptx

    ### MySQL数据库及索引详解 #### 一、MySQL简介与数据库发展 MySQL是一款非常流行的开源关系型数据库管理系统,由瑞典MySQL AB公司开发。它以其高性能、稳定性和易用性著称,广泛应用于Web应用程序和企业级系统中...

    MySQL-数据库-索引详解

    MySQL 数据库索引详解 MySQL 数据库索引是一种特殊的数据库结构,可以快速查询数据库表中特定记录。索引是提高数据库性能的重要方式。 索引的概念 ---------------- 索引是表中数据的目录。如果使用索引,则扫描...

    mysql索引共2页.pdf.zip

    【MySQL索引详解】 在MySQL数据库管理系统中,索引是一种数据结构,用于快速查找数据库表中的特定记录。索引能够显著提升查询性能,减少数据检索的时间,尤其在处理大量数据时,其作用尤为明显。本文件"mysql索引共...

    MySQL索引_021

    【MySQL索引详解】 在MySQL数据库管理中,索引是一种高效的数据检索机制,极大地提高了查询速度。本篇文章将深入探讨MySQL的索引机制,特别是基于InnoDB存储引擎的索引特性。 1. **B+树索引** - **每个索引对应一...

    MySQL索引_011

    【MySQL索引详解】 在MySQL数据库中,索引是一种用于加速数据检索的数据结构。它们减少了数据库服务器必须执行的磁盘I/O操作,从而显著提高了查询性能。本文将深入探讨索引的基本概念、工作原理以及如何在没有索引...

    MySQL索引详解大全

    索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度索引的优点是可以提高检索数据的速度索引的缺点是创建和维护索引需要耗费时间索引可以提高查询速度,会减慢写入速度1.普通索引2.唯一索引3.全文...

    一套MySQL索引总结就够了

    ### MySQL索引详解 #### 一、索引概念 索引是MySQL中一种高效的数据结构,主要用于提升数据检索的速度。随着数据库规模的增长,查询效率变得至关重要。合理的索引设计能够极大提升查询性能,减少I/O操作次数,降低...

    MySQL的索引-你真的了解了吗

    MySQL 索引详解 MySQL 索引是数据库管理系统中一个排序的数据结构,用于协助快速查询、更新数据库表中数据。 MySQL 索引历经了多个版本的迭代,从语法到底层数据结构都有很多改变。 MySQL 索引,我们真的了解么? ...

    mysql 索引失效详解

    MySQL 索引失效详解 MySQL 索引是一种加快数据检索速度的数据库对象。索引可以大幅度提高查询效率,但是如果不正确使用索引,可能会导致索引失效。索引失效是指MySQL 不能使用索引来加速查询,导致查询效率下降。 ...

    MySQL 索引最佳实践

    本文将深入探讨MySQL索引的最佳实践,旨在为开发者和数据库管理员提供实用指南。 ### 理解索引的重要性 索引的存在主要是为了加速数据库中的数据访问速度。在没有索引的情况下,数据库必须遍历整个表来查找特定的...

    mysql 索引与执行计划

    ### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。 ###### 1.1.1 索引是什么 索引(Index)在MySQL中是一种帮助数据库高效获取...

    mysql索引数据结构详解

    MySQL 索引数据结构详解 MySQL 索引是一种特殊的数据结构,它可以帮助快速定位和检索数据。索引的主要目的便是降低树的高度,从而提高查询效率。下面我们将详细介绍 MySQL 索引的数据结构和工作原理。 索引的存储 ...

    mysql索引知识点详解

    mysql索引知识点详解

    MySQL索引最佳实践

    #### 二、MySQL索引类型详解 ##### 1. B-Tree索引 - **定义**:B-Tree(平衡树)是最常见的索引类型,在大多数情况下使用的索引都属于此类。B-Tree能够支持范围查找、前缀查找以及等值查找等多种操作。 - **特点**...

    Mysql面试过关!(详解:索引+常用引擎+常见问题+sql调优)

    ### MySQL索引详解 #### 一、MySQL索引概述 索引在数据库中扮演着至关重要的角色,它能够显著提高数据检索的速度。简单来说,索引就像图书的目录一样,帮助用户快速定位所需数据的位置。当数据库表中的数据量增大...

    【MySQL】索引 (八).pdf

    ### MySQL索引详解 #### 一、索引概念与作用 **索引(Index)** 是一种用于提高数据库检索性能的数据结构。它可以帮助MySQL高效地获取数据,减少数据检索的时间,进而降低数据库的I/O成本。索引通过构建特定的数据...

    mysql 索引详细介绍

    MySQL中的索引是一种为了加速数据检索的数据库结构,它可以显著提升查询速度,降低数据库的负担。索引主要有两种类型:Hash索引和BTree索引。 1. BTree索引: - 全值匹配索引:当查询条件完全匹配索引的所有列时,...

Global site tag (gtag.js) - Google Analytics