zoukankan      html  css  js  c++  java
  • 数据库索引(index)相关知识点整理

    定义

    索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

    举例

    1.例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。

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

    索引的数据结构

    Hash、二叉搜索树、红黑树、B树以及B+树

    具体可参考 https://www.jianshu.com/p/2f562c7f10a0

    索引种类

    倒排索引:不是由记录来确定属性值,而是由属性值来确定记录的位置

    具体可以参考 https://blog.csdn.net/starzhou/article/details/87519973

    聚集索引:聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个。如果某索引不是聚集索引,则表中的行物理顺序与索引顺序不匹配,与非聚集索引相比,聚集索引有着更快的检索速度。

    唯一索引:唯一索引是不允许其中任何两行具有相同索引值的索引。

    主键索引:简称为主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行。该列称为表的主键。(主键索引是唯一索引的特定类型)

    候选索引:与主索引一样要求字段值的唯一性,并决定了处理记录的顺序。在数据库和自由表中,可以为每个表建立多个候选索引。

    非聚集索引:在非聚集索引中,数据库表中记录的物理顺序与索引顺序可以不相同。一个表中只能有一个聚集索引,但表中的每一列都可以有自己的非聚集索引。

    多列索引:一个多列索引可以认为是包含通过合并(concatenate)索引列值创建的值的一个排序数组。

    为什么不能每个列都建索引?

    为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。

    第一,创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。

    第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。

    第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度

    具体可参考 https://www.cnblogs.com/wphl-27/p/5898905.html

    索引的优缺点

    优点
    1.大大加快数据的检索速度;
    2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
    3.加速表和表之间的连接;(为什么?可见https://blog.csdn.net/sqlserverdiscovery/article/details/79129672)
    4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
    缺点
    1.索引需要占物理空间。
    2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。
    索引失效

    1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

    注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

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

    3.like查询是以%开头

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

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

    如何创建索引

    1、普通索引
         CREATE INDEX indexName ON mytable(username(length));
         创建表的时候直接指定: 

    CREATE TABLE mytable(
           ID INT NOT NULL, 
           username VARCHAR(16) NOT NULL, 
           INDEX [indexName] (username(length))
     );
      删除索引的语法:
    DROP INDEX [indexName] ON mytable;

    2、唯一索引
    它与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

    创建索引:
    CREATE UNIQUE INDEX indexName ON mytable(username(length))
    修改表结构:
    ALTER table mytable ADD UNIQUE [indexName] (username(length))
    创建表的时候直接指定:
    CREATE TABLE mytable( 
         ID INT NOT NULL, 
          username VARCHAR(16) NOT NULL, 
          UNIQUE [indexName] (username(length))
     );
    有四种方式来添加数据表的索引:

    1.ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
    2.ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
    3.ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。4.ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
    例如:

    创建索引:ALTER TABLE testalter_tbl ADD INDEX (c);
    删除索引:ALTER TABLE testalter_tbl DROP INDEX (c);
    显示索引信息
    SHOW INDEX FROM table_name

    详见:https://www.cnblogs.com/itchenguo/p/11049675.html

    索引的原理(为什么可以提高查询速度?)

    索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法。
    一般的顺序查找,复杂度为O(n),而二分查找复杂度为O(log2n)。当n很大时,二者的效率相差及其悬殊。
    举个例子:
    表中有一百万条数据,需要在其中寻找一条特定id的数据。如果顺序查找,平均需要查找50万条数据。而用二分法,至多不超过20次就能找到。二者的效率差了2.5万倍! 

    在一个或者一些字段需要频繁用作查询条件,并且表数据较多的时候,创建索引会明显提高查询速度,因为可由全表扫描改成索引扫描。

    (无索引时全表扫描也就是要逐条扫描全部记录,直到找完符合条件的,索引扫描可以直接定位)

    详见https://www.cnblogs.com/Berryxiong/p/6249427.html

    参考

    1.百度百科 https://baike.baidu.com/item/数据库索引/8751686?fr=aladdin

    2.数据库索引原理,及MySQL索引类型 https://blog.csdn.net/weixin_42181824/article/details/82261988

    3.百度百科聚集索引 https://baike.baidu.com/item/聚集索引/11041381?fr=aladdin

  • 相关阅读:
    web应用后台开发的故事
    XML的定义、用途、以及它的发展前景和存在的问题等等
    本学期(大三下学期)学习目标
    企业级应用与互联网应用的区别?
    新能源汽车无线充电管理网站4
    新能源汽车无线充电管理网站3
    新能源汽车无线充电管理网站2
    企业级应用与互联网应用的区别
    javaee 新学期新目标
    团队项目PCP--自我评价
  • 原文地址:https://www.cnblogs.com/Annetree/p/13509550.html
Copyright © 2011-2022 走看看