zoukankan      html  css  js  c++  java
  • 【转】MYSQL入门学习之九:索引的简单操作

    转载地址:http://www.2cto.com/database/201212/176772.html

    一、创建索引  www.2cto.com  
            MYSQL常用的索引类型主要有以下几种:
    1、普通索引
            CREATE INDEX idx_name ON table_name(table_col(length));
            如果索引字段是CHAR,varchar类型,length可以指定小于字段实际长度;如果是BLOB和TEXT类型,必须指定length。
            mysql> create index idx_name on user(name(10));
            mysql> show index from user;
            +-------+------------+----------+--------------+-------------+-----------+
            | Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation |
            +-------+------------+----------+--------------+-------------+-----------+
            | user  |          1 | idx_name |            1 | name        | A         |
            +-------+------------+----------+--------------+-------------+-----------+
    2、唯一索引
            CREATE UNIQUE INDEX idx_name ON table_name(table_col(length));
            它与普通索引类似,但不同的是,其索引列的值必须唯一,但允许有空值。
            mysql> create unique index idx_cn_name_u on user(cn_name(20));
            mysql> show index from user;
            +-------+------------+---------------+--------------+-------------+-----------+
            | Table | Non_unique | Key_name      | Seq_in_index | Column_name | Collation |
            +-------+------------+---------------+--------------+-------------+-----------+
            | user  |          0 | idx_cn_name_u |            1 | cn_name     | A         |
            | user  |          1 | idx_name      |            1 | name        | A         |
            +-------+------------+---------------+--------------+-------------+-----------+
    3、主键索引
            ALTER TABLE table_name ADD PRIMARY KEY (table_col);
            它是一种特殊的唯一索引,且不允许有空值。一个表只能有一个主键索引。
            mysql> alter table user add primary key (id);
            mysql> show index from user;
            +-------+------------+---------------+--------------+-------------+
            | Table | Non_unique | Key_name      | Seq_in_index | Column_name |
            +-------+------------+---------------+--------------+-------------+
            | user  |          0 | PRIMARY       |            1 | id          |
            | user  |          0 | idx_cn_name_u |            1 | cn_name     |
            | user  |          1 | idx_name      |            1 | name        |
            +-------+------------+---------------+--------------+-------------+
    4、组合索引
            CREATE INDEX idx_name ON table_name(table_col_1,table_col_2,...,table_col_n);
            它允许使用多个列作为索引列。
            mysql> create index idx_name_sex on user(name,sex);
            mysql> show index from user;
            +-------+------------+---------------+--------------+-------------+-----------+-
            | Table | Non_unique | Key_name      | Seq_in_index | Column_name | Collation |
            +-------+------------+---------------+--------------+-------------+-----------+-
            | user  |          0 | PRIMARY       |            1 | id          | A         |
            | user  |          0 | idx_cn_name_u |            1 | cn_name     | A         |
            | user  |          1 | idx_name      |            1 | name        | A         |
            | user  |          1 | idx_name_sex  |            1 | name        | A         |
            | user  |          1 | idx_name_sex  |            2 | sex         | A         |
            +-------+------------+---------------+--------------+-------------+-----------+-  www.2cto.com  
    二、删除索引
            DROP INDEX idx_name on table_name;
            ALTER TABLE table_name DROP INDEX idx_name;
            ALTER TABLE table_name DROP PRIMARY KEY;
            mysql> alter table user drop primary key;
            mysql> show keys from user;
            +-------+------------+---------------+--------------+-------------+-
            | Table | Non_unique | Key_name      | Seq_in_index | Column_name |
            +-------+------------+---------------+--------------+-------------+-
            | user  |          0 | idx_cn_name_u |            1 | cn_name     |
            | user  |          1 | idx_name      |            1 | name        |
            | user  |          1 | idx_name_sex  |            1 | name        |
            | user  |          1 | idx_name_sex  |            2 | sex         |
            +-------+------------+---------------+--------------+-------------+-
    三、查看索引
            SHOW INDEX FROM table_name;
            SHOW KEYS FROM table_name;
            查看索引语句的一个完全输出类似如下:
            mysql> show keys from user;
            +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
            | Table | Non_unique | Key_name      | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
            +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
            | user  |          0 | idx_cn_name_u |            1 | cn_name     | A         |        NULL |       20 | NULL   | YES  | BTREE      |         |
            | user  |          1 | idx_name      |            1 | name        | A         |        NULL |       10 | NULL   | YES  | BTREE      |         |
            | user  |          1 | idx_name_sex  |            1 | name        | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |
            | user  |          1 | idx_name_sex  |            2 | sex         | A         |        NULL |     NULL | NULL   | YES  | BTREE      |         |
            +-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
            其中:
            Table:表的名称
            Non_unique:如果索引不能包括重复词,则为0。如果可以,则为1。
            Key_name:索引的名称。
            Seq_in_index:索引中的列序列号,从1开始。
            Column_name:列名称。
            Collation:列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
            Cardinality:索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。
            Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
            Packed:指示关键字如何被压缩。如果没有被压缩,则为NULL。
            Null:如果列含有NULL,则含有YES。如果没有,则该列含有NO。
            Index_type:使用的索引类型(BTREE, FULLTEXT, HASH, RTREE)。
            Comment:索引说明。
     
    四、使用索引的注意事项
    1、索引不会包含有NULL值的列
            只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以在数据库设计时尽量不要让字段的默认值为NULL。
    2、使用短索引
            对列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
    3、不要在列上进行运算
            在列上进行运算,将导致索引失效而进行全表扫描。
    4、不使用NOT和<>操作
    5、索引列排序
            MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
  • 相关阅读:
    linux 程序安装目录/opt目录和/usr/local目录的区别
    Linux文件目录结构详解
    Jenkins卸载方法(Windows/Linux/MacOS)
    Jmeter案例demo
    idea打包java可执行jar包
    查看端口状态
    轻松掌握mongodb
    sphinx和coreseek
    redis
    redis默认端口6379以其名命名,是我孤陋寡闻了,是名性感美女(梅尔兹)
  • 原文地址:https://www.cnblogs.com/csshaw/p/3719060.html
Copyright © 2011-2022 走看看