码迷,mamicode.com
首页 > 数据库 > 详细

学习计划 mysql 索引

时间:2018-03-30 18:28:24      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:抽象   结构   mysq   ima   数据   索引   mysql   uri   动态   

感悟:

  索引这个东西真的是很抽象,刚开始很不理解,就像我刚开始接触AJAX一样。不过你接触之后发现,真的没那么难。

--

首先推荐文章:

  真的写的很好:http://www.cnblogs.com/whgk/p/6179612.html

--

一:索引是什么?建立索引的目的?

  数据库里的数据其实也是以文件的形式存储的,就像一本书一样。里面放了我们的各种数据。索引就像一个书签一样,可以直接帮我们找到内容,避免了我们一页一页找。

  这样的话,会节省很大时间。

  假如有一个2w的数据表,如果没有索引,那数据库一条条遍历查找,那如果数据更多呢?

  如果有了索引,那么会将需要查询的字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。

  其中MySQL中的索引的存储类型有两种:BTREE、HASH。 也就是用树或者Hash值来存储该字段,要知道其中详细是如何查找的,就需要会算法的知识了。我们现在只需要知道索引的作用,功能是什么就行。

--

二:MySQL中索引的优点和缺点和使用原则

  优点:

    极大的加快查询速度。

  缺点:

    摘自文章

    1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

    2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

    3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

  使用原则:

    摘自文章

    通过上面说的优点和缺点,我们应该可以知道,并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。

    1、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引,

    2、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。

    3、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引。

--

三:索引类型

  推荐文章里面已经很详细讲解了类型,我也不想单纯的复制/粘贴。下面只是谈谈我对此的理解。

  索引分类  单列索引(普通索引,唯一索引,主键索引)、组合索引、全文索引、空间索引、

--

四:普通索引

  基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点,开以建立多个索引

  由于我习惯在建立表之后添加和索引,所以只介绍 使用CREATE INDEX创建索引。

  先看一下我用于索引表结构

mysql> desc book;
+------------------+--------------+------+-----+---------+-------+
| Field            | Type         | Null | Key | Default | Extra |
+------------------+--------------+------+-----+---------+-------+
| bookid           | int(11)      | NO   |     | NULL    |       |
| bookname         | varchar(255) | NO   |     | NULL    |       |
| authors          | varchar(255) | NO   |     | NULL    |       |
| info             | varchar(255) | YES  |     | NULL    |       |
| comment          | varchar(255) | YES  |     | NULL    |       |
| year_publication | year(4)      | NO   |     | NULL    |       |
+------------------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

  现在为表 bookname 增加一条普通索引

mysql> CREATE INDEX BkBookNameIdx ON book(bookname);

  查看表索引

mysql> SHOW INDEX FROM book \G;;
*************************** 1. row ***************************
        Table: book
   Non_unique: 1
     Key_name: BkBookNameIdx
 Seq_in_index: 1
  Column_name: bookname
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

--

五:唯一索引

  索引列中的值必须是唯一的,但是允许为空值.

CREATE UNIQUE INDEX bookid ON book(bookid);

  查看索引

mysql> SHOW INDEX FROM book \G;
*************************** 1. row ***************************
        Table: book
   Non_unique: 0
     Key_name: bookid
 Seq_in_index: 1
  Column_name: bookid
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:

--

六:主键索引

  是一种特殊的唯一索引,不允许有空值。

  可以同时在一个字段设置主键索引和唯一索引

mysql> ALTER TABLE `book` ADD PRIMARY KEY ( `bookid` ) ;

--

六:组合索引

   在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。

  组合索引就是遵从了最左前缀,利用索引中最左边的列集来匹配行,这样的列集称为最左前缀,不明白没关系,举几个例子就明白了,例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如,age或者(name,age)组合就不会使用索引查询

 CREATE INDEX bookidaAS ON book(authors,bookid);

--

六:全文索引

http://blog.sina.com.cn/s/blog_ae1611930101a063.html

--

关于索引的使用感觉只是了解了个大概,之后再使用的话有更深入的理解的话回来补充这方面的知识。

学习计划 mysql 索引

标签:抽象   结构   mysq   ima   数据   索引   mysql   uri   动态   

原文地址:https://www.cnblogs.com/25-lH/p/8677645.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!