• 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;
  • 相关阅读:
    macbook 无声音解决方案
    webapck dev server代理请求 json截断问题
    百度卫星地图开启
    服务器 nginx配置 防止其他域名绑定自己的服务器
    记一次nginx php配置的心路历程
    遇到npm报错read ECONNRESET怎么办
    运行svn tortoiseSvn cleanup 命令失败的解决办法
    svn add 命令 递归目录下所有文件
    m4出现Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
    Ubuntu下安装GCC,mpc、mpfr、gmp
  • 原文地址:https://www.cnblogs.com/libingql/p/6481605.html
Copyright © 2020-2023  润新知