• MySQL系列:索引基本操作(4)


    1. 索引简介

      索引是一种特殊的数据库结构,可以用来快速查询数据中的特定记录。

      MySQL中索引包括:普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。

    1.1 索引定义

      索引由数据库表中一列或多列组合而成,作用是提高对表中数据的查询速度。

      索引是创建在表是的,对数据表中一列或多列的值进行排序的一种结构。

      MySQL索引包含两种存储类型:BTREE索引和HASH索引。InnoDB和MyISAM存储引擎支持BTREE索引,MEMORY存储引擎支持HASH索引和BTREE索引,默认为HASH索引。

      索引的优点:可以提高检索数据的速度。

      索引的缺点:创建和维护索引需要耗费时间,耗费的时间随数据量增加而增加;

            索引需要占用物理空间,每一个索引要占一定的物理空间;

            增加、删除和修改数据时,要动态维护索引,降低数据维护速度。

      索引可以提高查询的速度,但会影响插入记录的速度。向有索引的表中插入记录时,数据库系统会按照索引进行排序。

      插入大量记录时,最好的办法是先删除表中的索引,再插入数据,插入完成后,再创建索引。

    1.2 索引分类

      MySQL中索引包括:普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。

      1>. 普通索引

      在创建普通索引时,不附加任何限制条件。

      2>. 唯一性索引

      使用UNIQUE设置唯一性索引。在创建唯一性索引时,限制该索引的值必须是唯一的。

      唯一性索引,可以更快地确定某条记录。

      主键是一种特殊的唯一性索引。

      3>. 全文索引

      使用FULLTEXT设置索引为全文索引。全文索引只能创建在CHAR、VARCHAR或TEXT类型的字段上。

      查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。

      只有MyISAM存储引擎支持全文索引。

      4>. 单列索引

      

    1.3 索引设计原则

      (1)索引并非越多越好,一个表中如有大量的索引,占用磁盘空间,影响INSERT、UPDATE、DELETE等语句性能。

      (2)避免对经常更新的表进行过多的索引,索引中的列尽可能少。

      (3)数据量小的表最好不要使用索引。

      (4)在条件表达式中经常用到的不同值较多的列上创建索引,在不同值较少的列上不要创建索引。如:性别字段只有“男”和“女”两个不同值,无须创建索引。

      (5)当唯一性是某种数据本身的特征时,指定唯一索引。

      (6)在频繁排序或分组的列上创建索引,如果待排序的列有多个,可以创建组合索引。

    2. 创建索引

    2.1 创建表的时候创建索引

      创建表时创建索引的基本语法格式:

    CREATE TABLE table_name [col_name data_type]
    [UNIQUE] [INDEX | KEY] [index_name] (col_name[length]) [ASC | DESC]

      其中,INDEX与KEY为同义词,两者作用相同,用来指定创建索引。

      (1)创建普通索引

    mysql> CREATE TABLE product
        -> (
        -> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        -> product_no VARCHAR(255) NOT NULL DEFAULT '',
        -> product_name VARCHAR(255) NOT NULL DEFAULT '',
        -> KEY idx_product_no(product_no)
        -> );
    mysql> SHOW CREATE TABLE product;
    +---------+----------------------------------------------------+
    | Table   | Create Table                                       |
    +---------+----------------------------------------------------+
    | product | CREATE TABLE `product` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `product_no` varchar(255) NOT NULL DEFAULT '',
      `product_name` varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      KEY `idx_product_no` (`product_no`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +---------+----------------------------------------------------+

      (2)创建唯一索引

    mysql> CREATE TABLE product
        -> (
        -> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        -> product_no VARCHAR(255) NOT NULL DEFAULT '',
        -> product_name VARCHAR(255) NOT NULL DEFAULT '',
        -> UNIQUE KEY idx_product_no(product_no)
        -> );

      (3)创建组合索引

    mysql> CREATE TABLE product
        -> (
        -> id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
        -> product_no VARCHAR(255) NOT NULL DEFAULT '',
        -> product_name VARCHAR(255) NOT NULL DEFAULT '',
        -> KEY idx_product_no_name(product_no, product_name)
        -> );

      组合索引遵从最左前缀:从索引最左边的列进行匹配。

    2.2 查看表上的索引

      语法格式:

    SHOW INDEX FROM table_name
    mysql> SHOW INDEX FROM product;

      其中,主要参数:

        Table:创建索引的表

        Non_unique:索引非唯一,1表示非唯一索引,0表示唯一索引

        Key_name:索引名称

        Seq_in_index:该字段在索引中的位置,单列索引该值为1,组合索引为每个字段在索引定义中的顺序

        Column_name:定义索引的列字段

    2.3 在已存在的表上创建索引

      (1)使用ALTER TABLE创建索引

    ALTER TABLE table_name ADD [UNIQUE] [INDEX | KEY] [index_name] (col_name[length]) [ASC | DESC]
    mysql> ALTER TABLE product ADD INDEX idx_product_no(product_no ASC);

      (2)使用CREATE INDEX创建索引

    CREATE [UNIQUE] [INDEX | KEY] [index_name] ON table_name(col_name[length]) [ASC | DESC]

    2.4 删除索引

      (1)使用ALTER TABLE删除索引

    ALTER TABLE table_name DROP INDEX index_name;
    mysql> ALTER TABLE product DROP INDEX idx_product_no;

      (2)使用DROP INDEX语句删除索引

    mysql> DROP INDEX index_name on table_name;
    mysql> DROP INDEX idx_product_no on product;
  • 相关阅读:
    第一阶段冲刺(第六天)
    第一阶段冲刺(第五天)
    第一阶段冲刺(第四天)
    第一阶段冲刺(第三天)
    第一阶段冲刺(第二天)
    个人学习进度(第十一周)
    第一阶段冲刺(第一天)
    个人学习进度(第十周)
    个人学习进度(第九周)
    php面向对象说明
  • 原文地址:https://www.cnblogs.com/libingql/p/6481605.html
Copyright © 2020-2023  润新知