精华内容
下载资源
问答
  • 数据库索引讲解

    2020-04-09 20:39:59
    什么是数据库索引 数据索引的作用是什么? 数据库索引其实就是为了使查询数据效率快. 数据库索引有哪些呢? 聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。 非聚集索引:就是给普通字段...

    什么是数据库索引

    1. 数据索引的作用是什么?

    数据库索引其实就是为了使查询数据效率快.

    2. 数据库索引有哪些呢?
    • 聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。
    • 非聚集索引:就是给普通字段加上索引。

    key ‘idx_age’ (‘age’)

    • 联合索引:就是好几个字段组成的索引,称为联合索引。

    key ‘idx_age_name_sex’ (‘age’,‘name’,‘sex’)

    • 联合索引遵从最左前缀原则,通过下面的一个案例为大家进行解释,如下的A,B,C,D,E,F那些会走索引操作.

    A:select * from student where age = 16 and name = ‘小张’
    B:select * from student where name = ‘小张’ and sex = ‘男’
    C:select * from student where name = ‘小张’ and sex = ‘男’ and age = 18
    D:select * from student where age > 20 and name = ‘小张’
    E:select * from student where age != 15 and name = ‘小张’
    F:select * from student where age = 15 and name != ‘小张’

    A遵从最左匹配原则,age是在最左边,所以A走索引;
    B:直接从name开始,没有遵从最左匹配原则,所以不走索引;
    C:虽然从name开始,但是有索引最左边的age,mysql内部会自动转成where age = ‘18’ and name = ‘小张’ and sex = ‘男’ 这种,所以还是遵从最左匹配原则;
    D:这个是因为age>20是范围,范围字段会结束索引对范围后面索引字段的使用,所以只有走了age这个索引;
    E:这个虽然遵循最左匹配原则,但是不走索引,因为!= 不走索引;如果不是很清楚{!= 不走索引}可以去了解一下sql语句优化.
    F:这个只走age索引,不走name索引,原因同上;

    3. 那些不走索引的案例

    表student中两个字段age,name加了索引
    1.key ‘idx_age’ (‘age’)
    2.key ‘idx_name’ (‘name’)

    • 1.Like这种就是%在前面的不走索引,在后面的走索引

    A:select * from student where ‘name’ like ‘王%’
    B:select * from student where ‘name’ like ‘%小’

    A走索引,B不走索引
    
    • 2.用索引列进行计算的,不走索引

    A:select * from student where age = 10+8
    B:select * from student where age + 8 = 18

    A走索引,B不走索引
    
    • 3.对索引列用函数了,不走索引

    A:select * from student where concat(‘name’,‘哈’) =‘王哈哈’;
    B:select * from student where name = concat(‘王哈’,‘哈’);

    A不走索引,B走索引
    
    • 4.索引列用了!= 不走索引

    select * from student where age != 18

    4. 索引在磁盘上面的的存储?

    聚集索引和非聚集索引存储的不相同,那么来说下都是怎么存储的?

    • 学生表
    create table `student` (
     `id` int(11) not null auto_increment comment '主键id',
     `name` varchar(50) not null default '' comment '学生姓名',
     `age` int(11) not null default 0 comment '学生年龄',
     primary key (`id`),
     key `idx_age` (`age`),
     key `idx_name` (`name`)
    ) ENGINE=InnoDB default charset=utf8 comment ='学生信息';
    

    在这里插入图片描述
    id 为主键索引,name和age为非聚集索引

    • 聚集索引在磁盘中的存储
      在这里插入图片描述
      聚集索引里面存储的是表里面所以行的数据.每一个数据页在不同的磁盘上面
      如果要查询id=5的数据,那么先吧磁盘0读到内存中,然后用二分法查找到id=5是存在3-6之间,通过指针p1查找到磁盘2地址,然后将磁盘2读入内存中,用二分查找方式查找到id=5的数据。
    • 非聚集索引在磁盘中的存储
      在这里插入图片描述

    叶子结点存储的是聚集索引键,而不存储表里面所有的行数据,所以在查找的时候,只能查找到聚集索引键,再通过聚集索引去表里面查找到数据。
    第一步 :如果要查找到name = 小徐,首先将磁盘0加载到内存中,然后用二分查找的方法查到在指针p1所指的地址上,然后通过指针p1所指的地址可知道在磁盘2上面,然后通过二分查找法得知小徐id=4;
    第二步:然后在根据id=4将磁盘0加载到内存中,然后通过二分查找的方法查到在指针p1所指的地址上,然后通过指针p1所指的地址可知道在磁盘2上面,然后通过id=4查找出郑正行数据,就查找出name=小徐的数据了。

    展开全文
  • http://blog.codinglabs.org/articles/theory-of-mysql-index.html https://blog.csdn.net/klchht/article/details/78146443?locationNum=9&fps=1
    展开全文
  • 转载于:https://www.cnblogs.com/junlu/p/9455341.html

    转载于:https://www.cnblogs.com/junlu/p/9455341.html

    展开全文
  • 下面介绍几种常见的MySQL索引类型在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL );我们随机向里面插入...

    MySQL索引的建立对于MySQL的高效运行是很重要的。下面介绍几种常见的MySQL索引类型

    在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表:

    CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL );

    我们随机向里面插入了10000条记录,其中有一条:5555, admin。

    在查找username="admin"的记录 SELECT * FROM mytable WHERE username='admin';时,如果在username上已经建立了索引,MySQL无须任何扫描,即准确可找到该记录。相反,MySQL会扫描所有记录,即要查询10000条记录。

    索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索包含多个列。

    MySQL索引类型包括:

    一、普通索引

    这是最基本的索引,它没有任何限制。它有以下几种创建方式:

    1.创建索引

    代码如下:

    CREATE INDEX indexName ON mytable(username(length));

    如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length,下同。

    2.修改表结构

    代码如下:

    ALTER mytable ADD INDEX [indexName] ON (username(length)) -- 创建表的时候直接指定

    CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );

    -- 删除索引的语法:

    DROP INDEX [indexName] ON mytable;

    二、唯一索引

    它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:

    代码如下:

    CREATE UNIQUE INDEX indexName ON mytable(username(length))

    -- 修改表结构

    ALTER mytable ADD UNIQUE [indexName] ON (username(length))

    -- 创建表的时候直接指定

    CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );

    三、主键索引

    它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:

    代码如下:

    CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) );

    当然也可以用 ALTER 命令。记住:一个表只能有一个主键。

    四、组合索引

    为了形象地对比单列索引和组合索引,为表添加多个字段:

    CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INT NOT NULL );

    为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将 name, city, age建到一个索引里:

    代码如下:

    ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age);[code]

    建表时,usernname长度为 16,这里用 10。这是因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高INSERT的更新速度。

    如果分别在 usernname,city,age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率也会大不一样,远远低于我们的组合索引。虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了下面三组组合索引:

    usernname,city,age usernname,city usernname 为什么没有 city,age这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个SQL就会用到这个组合索引:

    [code]

    SELECT * FROM mytable WHREE username="admin" AND city="郑州" SELECT * FROM mytable WHREE username="admin"

    而下面几个则不会用到:

    代码如下:

    SELECT * FROM mytable WHREE age=20 AND city="郑州" SELECT * FROM mytable WHREE city="郑州"

    展开全文
  • 1.两种主要的引擎:MyISAM和InnoDB2.如何查看自己的表是什么类型:http://www.cnblogs.com/luosongchao/archive/2013/05/23/3095929.html3.分词索引大比拼:https://ruby-china.org/topics/280004.数据库索引讲解:...
  • 通俗讲解数据库索引

    2020-05-07 14:05:31
    前言 提起索引我想你应该不陌生,当我们查阅一本大部头的时候我们应该如何...相同,数据库为了能快速的寻找到指定的数据必须要建立索引。对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加...
  • 数据库索引原理讲解之二

    千次阅读 2016-01-25 13:02:56
    本文转自:http://www.cnblogs.com/c-gis/archive/2012/07/27/2612175.html 和 http://blog.csdn.net/coolzyt/article/details/4085678  本文里我只是对其中一些自认为讲的比较...索引是一种特殊类型的数据库对象,
  • 一般一个数据库系统包含以下: 存储(文件系统):将设备持久化到存储设备当中 程序实例:对存储进行逻辑上的管理 物理存储关系的存储管理模块 优化执行效率的缓存模块 对sql语句进行解析的SQL解析模块 记录...
  • 1.数据库引入了索引 用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时,搜索数据就需要很长的时间,这就造成了服务器的资源浪费。为了...
  • 在MySQL中,对于索引的使用并是一直都采用正确的决定。 简单表的示例: create TABLE `r2` ( ID` int(11) DEFAULT NULL, ID1` int(11) DEFAULT NULL, CNAME` varchar(32) DEFAULT NULL, KEY `ID1` (`ID1`) ) ...
  • mysql的数据库 索引

    2016-09-22 20:10:00
    1.两种主要的引擎:MyISAM和InnoDB 2.如何查看自己的表是什么类型:http://www.cnblogs.com/luosongchao/archive/2013/05/23/3095929.html ... 4.数据库索引讲解:http://www.cnblogs.com/morvenhuang...
  • Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解前言 前言 Mysql、Oracle、PostgreSql数据库索引失效场景详细讲解。废话不多说直接贴: 1、任何计算、函数、类型转换 2、!=、<> 3、IS NULL或者IS NOT ...
  • 数据库索引就好比是一本书的目录部分,便于大家查找数据库中数据,方便快捷,给数据库管理员的工作带来了很多的便利。在MySQL数据库中,对于索引的使用并是一直都采用正确的决定。简单表的示例:以下是代码片段: ...
  • 数据库索引技术

    2012-11-21 01:23:47
    讲解数据库索引方面很不错的资料,看看吧!
  • 数据库索引设计与优化》提供了一种简单、高效、通用的关系型数据库索引设计方法。作者通过系统的讲解及大量的案例清晰地阐释了关系型数据库的访问路径选择原理,以及表和索引的扫描方式,详尽地讲解了如何快速地...
  • 1.数据库引入了索引  用户对数据库最频繁的操作是进行数据查询。一般情况下,数据库在进行查询操作时需要对整个表进行数据搜索。当表中的数据很多时,搜索...数据库索引实际是什么?(两部分组成)
  • http://blog.csdn.net/zoucui/article/details/1429202
  • 数据库中的索引讲解

    千次阅读 2011-12-21 10:26:08
     1....  索引是在数据库表或者视图上创建的对象,目的是... 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单(深刻理解)。  按照
  • 数据库索引

    2018-12-21 20:11:26
    网上很多讲解索引的文章对索引的描述是这样的「索引就像书的目录, 通过书的目录就准确的定位到了书籍具体的内容」,这句话描述的非常正确, 但就像脱了裤子放屁,说了跟没说一样,通过目录查找书的内容自然是要比一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,355
精华内容 542
关键字:

数据库索引讲解