zoukankan      html  css  js  c++  java
  • 数据库--索引

    什么是索引?

    索引是创建在数据库表对象上的,对一个字段或者多个关联字段进行排序的结构。索引包含由表或者视图中的一列或者多列生成的键。这些键以B-数或者哈希表的结构存储在磁盘上。

    索引存储分类:

    InnoDB和MyISAM都支持B-树索引(BTREE)

    Mysql索引存储分类:

    1.B-树索引(BTREE)

    2.哈希索引(HASH)

    oracle索引存储分类:

    1.B-树索引(BTREE)

    2.位图索引

    3.方向键索引

    SQLServer索引存储分类

    1.聚簇索引

    聚簇索引:是按照数据存放的物理位置为顺序的,聚簇索引能提高多行检索的速度:

      1:聚集索引根据数据行的键值在表或者视图中排序和存储这些数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序。

      2:只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表成为聚集表。如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中。

    2.非聚簇索引

    非聚簇索引:非聚簇索引对于单行的检索很快。

      1.非聚集索引具有独立于数据行的结构。非聚集索引包含非聚集索引键值,并且每个键值项都有指向包含该键值的数据行的指针。

      2:从非聚集索引中的索引行指向数据行的指针成为行定位器。行定位器的结构取决于数据页是存储在堆中还是聚集表中。对于堆,行定位器是指向行的指针。对于聚集表,行定位器是聚集索引键。

      3:你可以向非聚集索引的叶级添加非键列以跳过现有的索引键限制(900字节和16键列),并执行完整范围内的索引查询。

    常见的6类索引

    1:普通索引

      允许在定义索引的列中插入重复的值和空值,唯一任务是访问速度,因此常出现WHEREh和ORDER BY 语句中。

    2.唯一索引  UNIQUE

      不允许两行具有相同的值,索引列数据不能重复。例如在身份证列创建唯一索引之后,该表会拒绝接收重复的身份证号码。但是允许空值。若创建唯一约束,则自动创建唯一索引,尽管唯一索引有助于找到信息,但是为了最佳性能仍然建议使用主键约束。

    3.主键索引

      在数据库关系图中为表定义主键,则自动创建主键索引,主键索引是唯一索引的特殊类型。主键列每个值,非空、唯一在查询中使用主键索引时,允许快速访问。

    4.复合索引

      对多个列组合创建索引,只有在查询中使用了组合索引最左边的字段时,索引才被使用,即第一个字段作为前缀的集合。

    5.全文检索:FULLTEXT

      支持值的全文查找,允许这些索引列中插入重复值和空值,可以在CHAR、VARCHAR、TEXT类型的列上创建,主要用于大量文本文字中搜索字符串,效率比使用SQL和LIKE高,Mysql4.5中只有MyISAM支持全文检索。

    6.空间索引:SPATIAL

      对空间类型的列创建的索引,如GEOMETRY、POINT等,创建空间索引的列必须声明为NOT NULL,只能在MyISAM存储引擎表中创建。

    1...创建索引

    修改表结构:

      ALTER TABLE student ADD INDEX(english);

    创建表的时候建索引:

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

    CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

    ON table_name (column_name[length]…);

    ----------------------------------------------------------------------------------------

    UNIQUE|FULLTEXT|SPATIAL:

    分别表示唯一索引,全文索引,空间索引,为可选参数

    index_naem:指定索引名

    table_name:指定创建索引的表名

    column_name:指定创建索引的列名

    length:指定索引长度,可选参数,只有字符串类型才能指定

    2:删除索引

    DROP INDEX index_name ON table_name;

    注意事项:

    1:删除表时,索引同时被删除

    2:删除表的列时,如果删除的列为索引的组成部分,该列会从索 引中删除,直到索引中的列全部被删除了,索引才被删除。

    3:查看索引

    SHOW INDEX FROM table_nameG;  G可省

       

    如何合理创建索引?

    1:频繁搜索的列

    2:常作为查询选择的列where后面

    3:经常排序分组的列 order by

    4:经常作为连接的列(主键、外键)

    5. 值不会经常修改的列

    能用于创建索引的列:

    1:仅包含几个不同的值

    2:仅包含几行记录(浪费资源和时间,得不偿失)

     使用索引的经验:

    1:查询时减少使用*全部返回,不要返回不需要的列

    2:索引应该尽量小,在字节数小的列上建立索引

    3:WHERE子句中有多个条件表达式时,包含索引的表达式应该放在其它条件表达式之前。

    4:避免在ORDER BY 子句中使用表达式。(索引会失效的)

    5:根据业务数据发生频率,定期重新生成或重新组织索引,进 行碎片整理。

    对于一个多列索引,如果在WHERE子句的所有AND层次使用索引,将不使用来索引优化查询。为了能够使用索引优化查询,必须把一个多列索引的前缀使用在一个AND条件组中。

                   

    下列WHERE子句使用索引:

                             

    ... WHERE index_part1=1 AND index_part2=2

                         

    ... WHERE index=1 OR A=10 AND index=2 /* index = 1 OR index = 2 */

                 

    ... WHERE index_part1='hello' AND index_part_3=5

                       

    /* optimized like "index_part1='hello'" */

                     

    这些WHERE子句不使用索引:

                             

    ... WHERE index_part2=1 AND index_part3=2 /* index_part_1 is not used */

                 

    ... WHERE index=1 OR A=10 /* No index */

                 

    ... WHERE index_part1=1 OR index_part2=10 /* No index spans all rows */

                 

    如果LIKE参数是一个不以一个通配符字符起始的一个常数字符串,MySQL也为LIKE比较使用索引。

           

    例如,下列SELECT语句使用索引:

                     

    mysql> select * from tbl_name where key_col LIKE "Patrick%";

               

    mysql> select * from tbl_name where key_col LIKE "Pat%_ck%";

               

    在第一条语句中,只考虑有"Patrick" <= key_col < "Patricl"的行。在第二条语句中,只考虑有"Pat" <= key_col < "Pau"的行。

    下列SELECT语句将不使用索引:

                     

    mysql> select * from tbl_name where key_col LIKE "%Patrick%";

               

    mysql> select * from tbl_name where key_col LIKE other_col;

               

    在第一条语句中,LIKE值以一个通配符字符开始。在第二条语句中,LIKE值不是一个常数。

  • 相关阅读:
    编程风格与注意事项(一)
    BB-Black 初体验之远程控制篇
    我的BB-Black之旅……(一)
    等精度频率计设计中的猫腻
    Linux查看物理CPU个数、核数、逻辑CPU个数、Cpu型号
    基于TransportClient的elasticsearch(es)消费kafka数据---Java程序设计
    elasticsearch概述
    HBase 性能优化笔记
    hive1.2.1搭建遇到的问题
    Hbase的表设计
  • 原文地址:https://www.cnblogs.com/blacksmallcat/p/10157347.html
Copyright © 2011-2022 走看看