• mysql索引


    索引是对数据表中一列或者多列的值进行排序的一种数据结构(B+ 树),提高数据库中特定数据的查询速度(指针)

    MyISAM    InnoDB    只支持BTREE索引

    Memory/heap    可以支持HASH和BTree索引

    • 普通索引  普通索引是mysql的基本索引类型,允许在定义索引的列中插入重复值和空值
    • 唯一索引  索引值必须唯一,允许有空值,如果是组合索引,则列的组合必须唯一,主键是特殊的唯一索引(NO null)
    • 单列索引  一个索引只包含单个列,一个表可以有多个单列索引
    • 组合索引  只有在查询的时候使用到了这些字段的左边字段时,索引才会被使用,遵循最左前缀集合
    • 全文索引  (MyISAM) 在索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。(char,varchar,text)
    • 空间索引   (MyISAM) 空间索引是对空间数据类型的字段建立的索引,mysql的空间数据类型有4种 分别为 GEOMETRY,POINT,LINESTRING,POLYGON, mysql使用spatial 进行扩展,声明空间索引的列必须为 not null

     索引的设计原则

    1.控制索引数量      (占用空间,影响数据库执行性能)
    2.避免对经常更新的列建索引           (难以维护)
    3.数据少的话,就别使用索引了
    4。不同值多的建索引,像性别啊,建立索引用处也不大
    5.对唯一列使用唯一索引,提高查询速度
    6.在频繁分组的列上建索引
    View Code

    创建索引(在创建表的时候创建)

    create table table_name (col_name data_type)
    [UNIQUE| FULLTEXT|SPATIAL]   [INDEX|KEY] (index_name) 
    (col_name  [length]) | ASC| DESC]
    View Code

    1.创建普通索引

    最基本的索引类型,没有唯一性之类的限制,其作用是加快对数据的访问速度
    
    mysql> create table book
        -> (
        -> bookid int not null,
        -> bookname varchar(255) not null,
        -> authors  varchar(255) not null,
        -> info     varchar(255) not null,
        -> comment  varchar(255) not null,
        -> year_publication YEAR NOT NULL,
        -> INDEX(year_publication)
        -> );
    Query OK, 0 rows affected (0.11 sec)
    
    mysql> show create  table book G
    *************************** 1. row ***************************
           Table: book
    Create Table: CREATE TABLE `book` (
      `bookid` int(11) NOT NULL,
      `bookname` varchar(255) NOT NULL,
      `authors` varchar(255) NOT NULL,
      `info` varchar(255) NOT NULL,
      `comment` varchar(255) NOT NULL,
      `year_publication` year(4) NOT NULL,
      KEY `year_publication` (`year_publication`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    View Code

    2.创建唯一索引

    mysql> create table t1
        -> (
        -> id int not null,
        -> name char(30) not null,
        -> UNIQUE INDEX uniqIdx(id)
        -> );
    Query OK, 0 rows affected (0.09 sec)
    
    mysql> show create table t1 G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `id` int(11) NOT NULL,
      `name` char(30) NOT NULL,
      UNIQUE KEY `uniqIdx` (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    View Code

    3.创建单列索引

    mysql> create table t2
        -> (
        -> id int not null,
        -> name char(50) null,
        -> INDEX SingleIdx(name)
        -> );
    Query OK, 0 rows affected (0.11 sec)
    
    mysql> show create table t2 G
    *************************** 1. row ***************************
           Table: t2
    Create Table: CREATE TABLE `t2` (
      `id` int(11) NOT NULL,
      `name` char(50) DEFAULT NULL,
      KEY `SingleIdx` (`name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    View Code

    4.创建组合索引

    mysql> create table t3
        -> (
        -> id int not null,
        -> name char(30) not null,
        -> age int not null,
        -> info varchar(255),
        -> index multildx(id,name,age)
        -> );
    Query OK, 0 rows affected (0.11 sec)
    
    mysql> show create table t3  G
    *************************** 1. row ***************************
           Table: t3
    Create Table: CREATE TABLE `t3` (
      `id` int(11) NOT NULL,
      `name` char(30) NOT NULL,
      `age` int(11) NOT NULL,
      `info` varchar(255) DEFAULT NULL,
      KEY `multildx` (`id`,`name`,`age`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    
    mysql> explain select * from t3 where id=1 and name='joe'  G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: t3
             type: ref
    possible_keys: multildx
              key: multildx
          key_len: 34
              ref: const,const
             rows: 1
            Extra: Using index condition
    1 row in set (0.00 sec)
    
    mysql> 
    
    
    
    遵循最左前缀原则,索引行中 按 id/name/age 的顺序存放
    可以有如下组合
    id,name,age
    id,name
    id
    View Code

     5.创建全文索引

    全文索引适合于大的数据集,只有MyISAM搜索引擎支持全文索引
    只有在char,varchar和text列创建索引,不支持局部索引
    
    
    mysql> create table t4
        -> (
        -> id int not null,
        -> name char(30) not null,
        -> age int not null,
        -> info varchar(255),
        -> fulltext index FullTxtIdx(info)
        -> ) ENGINE=MyISAM;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show create table t4  G
    *************************** 1. row ***************************
           Table: t4
    Create Table: CREATE TABLE `t4` (
      `id` int(11) NOT NULL,
      `name` char(30) NOT NULL,
      `age` int(11) NOT NULL,
      `info` varchar(255) DEFAULT NULL,
      FULLTEXT KEY `FullTxtIdx` (`info`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    mysql> 
    View Code

    6.空间索引

    空间索引必须在MyISAM类型的表中创建,且空间类型的字段必须为非空
    
    
    mysql> create table t5(
        -> g geometry not null,
        -> spatial index spatIdx(g) 
        -> ) ENGINE=MyISAM;
    Query OK, 0 rows affected (0.02 sec)
    
    mysql> show create table t5  G
    *************************** 1. row ***************************
           Table: t5
    Create Table: CREATE TABLE `t5` (
      `g` geometry NOT NULL,
      SPATIAL KEY `spatIdx` (`g`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    View Code

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

    ALTER TABLE table_name ADD [unique | FULLTEXT| SPATIAL]
    [INDEX|KEY] [index_name] (col_name[length],...)  [ASC  |   DESC]
    View Code

    1.ALTER table 创建索引

    mysql> show index from book  G
    *************************** 1. row ***************************
            Table: book
       Non_unique: 1
         Key_name: year_publication
     Seq_in_index: 1
      Column_name: year_publication
        Collation: A
      Cardinality: 0
         Sub_part: NULL
           Packed: NULL
             Null: 
       Index_type: BTREE
          Comment: 
    Index_comment: 
    1 row in set (0.00 sec)
    
    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) | NO   |     | NULL    |       |
    | comment          | varchar(255) | NO   |     | NULL    |       |
    | year_publication | year(4)      | NO   | MUL | NULL    |       |
    +------------------+--------------+------+-----+---------+-------+
    
    
    mysql> alter table book ADD INDEX BkNameIdx (bookname(30));
    Query OK, 0 rows affected (0.10 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    
    mysql> show index from book  G
    *************************** 1. row ***************************
            Table: book
       Non_unique: 1
         Key_name: year_publication
     Seq_in_index: 1
      Column_name: year_publication
        Collation: A
      Cardinality: 0
         Sub_part: NULL
           Packed: NULL
             Null: 
       Index_type: BTREE
          Comment: 
    Index_comment: 
    *************************** 2. row ***************************
            Table: book
       Non_unique: 1
         Key_name: BkNameIdx
     Seq_in_index: 1
      Column_name: bookname
        Collation: A
      Cardinality: 0
         Sub_part: 30
           Packed: NULL
             Null: 
       Index_type: BTREE
          Comment: 
    Index_comment: 
    2 rows in set (0.00 sec)
    View Code
    alter 系列
    
    ALTER  TABLE book ADD INDEX BkNameIdx (bookname(30))
    
    ALTER  TABLE book ADD UNIQUE index UniqidIdx( bookid )
    
    建立组合索引
    
    ALTER TABLE book ADD INDEX BkAuAndInfoIdx (authors(30),info(50))
    
    
    建立全文索引
    
    ALTER TABLE t6 ADD FULLTEXT infoFTIdx(info);
    
    
    空间索引比较特殊,其拥有的字段类型有特有的类型
    mysql> CREATE TABLE t7 (g GEOMETRY NOT NULL) ENGINE=MyISAM;
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> ALTER TABLE t7 ADD SPATIAL INDEX spatIdx(g);
    Query OK, 0 rows affected (0.01 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show index from t7 G
    *************************** 1. row ***************************
            Table: t7
       Non_unique: 1
         Key_name: spatIdx
     Seq_in_index: 1
      Column_name: g
        Collation: A
      Cardinality: NULL
         Sub_part: 32
           Packed: NULL
             Null: 
       Index_type: SPATIAL
          Comment: 
    Index_comment: 
    1 row in set (0.00 sec)
    View Code

    使用create index 创建索引

    基本语法
    create [unique| fulltext|spatial] INDEX index_name
    on table_name (col_name[length,....]) [ASC|DESC]
    
    新建数据表
    mysql> create table book
        -> (
        -> bookid INT NOT NULL,
        -> bookname VARCHAR(255) NOT NULL,
        -> authors VARCHAR(255) NOT NULL,
        -> info VARCHAR(255) NULL,
        -> comment VARCHAR(255) NULL,
        -> year_publication  YEAR NOT NULL
        -> );
    Query OK, 0 rows affected (0.18 sec)
    
    (与ALTER 语法一致)
    mysql> CREATE INDEX BkNameIdx ON book(bookname);
    ERROR 1061 (42000): Duplicate key name 'BkNameIdx'
    mysql> CREATE UNIQUE INDEX UniqueIdx ON book(bookid);
    Query OK, 0 rows affected, 1 warning (0.08 sec)
    Records: 0  Duplicates: 0  Warnings: 1
    
    mysql> CREATE  INDEX UniqueIdx ON book(comment);
    ERROR 1061 (42000): Duplicate key name 'UniqueIdx'
    mysql> Create INDEX bkAuAndInfoIdx on book(authors,info);
    Query OK, 0 rows affected (0.10 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> 
    View Code

    索引删除

    语法
    ALTER TABLE table_name DROP INDEX index_name
    
    mysql> alter table book drop index BkNameIdx;
    Query OK, 0 rows affected (0.06 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    View Code
    RUSH B
  • 相关阅读:
    C++下载数据至.map/.txt/.list文件
    Byte数组转浮点数
    linux下进程的最大线程数、进程最大数、进程打开的文件数
    linux后台程序开发常用工具
    linux下csv导出文件中文乱码问题
    50个高端大气上档次的管理后台界面模板(转)
    如何注册.net 的类库dll 为com组件(转)
    vue页面信息
    CSS特效
    Css样式
  • 原文地址:https://www.cnblogs.com/tangsonghuai/p/11002634.html
Copyright © 2020-2023  润新知