MySQL 数据库 索引

数据库索引概述

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
从数据搜索实现的角度来看,索引也是另外一类文件/记录,它包含着可以指示出相关数据记录的各种记录。其中,每一索引都有一个相对应的搜索码,字符段的任意一个子集都能够形成一个搜索码。这样,索引就相当于所有数据目录项的一个集合,它能为既定的搜索码值的所有数据目录项提供定位所需的各种有效支持。

可以把数据库索引理解成一本书的目录,利用目录可以查找书中的内容。

索引作用

设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率
特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍
可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
通过创建唯一性索引保证数据表数据的唯一性
可以加快表与表之间的连接
在使用分组和排序时,可大大减少分组和排序时间

索引优缺点

优点
可以快速的找到所需要的的资源
缺点
占用空间

索引分类

普通索引
这是最基本的索引类型,而且它没有唯一 性之类的限制
唯一性索引
这种索引和前面的“普通索引”基本相同但 有一个区别:索引列的所有值都只能出现一次,即必须唯一
主键
主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY
全文索引
MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建
单列索引与多列索引
索引可以是单列上创建的索引,也可以是在多列上创建的索引
最左原则,从左往右依次执行

索引创建原则

表的主键、外键必须有索引(表的外键为另一张表的主键,两张表有一定关联)
数据量超过300行的表应该有索引
经常与其他表进行连接的表,在连接字段上应该建立索引
唯一性太差的字段不适合建立索引
更新太频繁地字段不适合创建索引
经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引
索引应该建在选择性高的字段上
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

来吧!展示!

创建普通索引

方法一:可以在创建表时制作,也可以修改表
mysql> create index sy1 on kelong(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from kelong\G;
*************************** 2. row ***************************
        Table: kelong
   Non_unique: 1
     Key_name: sy1
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 4
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

方法二:直接修改
mysql> alter table kelong add index sy2(jiti);
Query OK, 0 rows affected (0.01 sec)
mysql> desc kelong;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(5)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   | MUL | NULL    |                |
| year  | int(5)      | NO   |     | NULL    |                |
| jiti  | varchar(20) | YES  | MUL | 未知    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

创建唯一性索引

mysql> create unique index s1 on kelong(year);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> desc kelong;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(5)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   | MUL | NULL    |                |
| year  | int(5)      | NO   | UNI | NULL    |                |
| jiti  | varchar(20) | YES  | MUL | 未知    |                |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

我这边新创了一个表,接着演示
mysql> alter table banji add unique s3(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc banji;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| xuehao  | int(3)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(8)  | NO   | UNI | NULL    |                |
| address | varchar(60) | YES  |     | 未知    |                |
+---------+-------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

删除索引

mysql> drop index s3 on banji;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> drop index sy2 on kelong;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table kelong drop index sy1;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

创建组合索引

mysql> create table biao(id int(3) not null,name varchar(20) not null,address varchar(60) not null,age int(3) not null,index biao(id,name,address,age));
Query OK, 0 rows affected (0.01 sec)

mysql> show index from biao\G;
*************************** 1. row ***************************
        Table: biao
   Non_unique: 1
     Key_name: biao
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: biao
   Non_unique: 1
     Key_name: biao
 Seq_in_index: 2
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: biao
   Non_unique: 1
     Key_name: biao
 Seq_in_index: 3
  Column_name: address
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 4. row ***************************
        Table: biao
   Non_unique: 1
     Key_name: biao
 Seq_in_index: 4
  Column_name: age
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 

创建全文索引

方法一,创建表时创建
mysql> create table lie(
    -> id int(3) not null auto_increment,
    -> ming varchar(10) not null,
    -> xing varchar(6) not null,
    -> primary key(id),
    -> fulltext key ming_xing_fulltext(ming,xing)
    -> )engine=myisam default charset=utf8;
Query OK, 0 rows affected (0.00 sec)

方法二,在已存在表上创建
mysql> alter table dam add fulltext qw(id,name);
Query OK, 0 rows affected, 1 warning (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 1

查看索引

mysql> show index from dam\G;
*************************** 1. row ***************************
        Table: dam
   Non_unique: 1
     Key_name: qw
 Seq_in_index: 1
  Column_name: id
    Collation: NULL
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: dam
   Non_unique: 1
     Key_name: qw
 Seq_in_index: 2
  Column_name: name
    Collation: NULL
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

mysql> show keys from dam\G;
*************************** 1. row ***************************
        Table: dam
   Non_unique: 1
     Key_name: qw
 Seq_in_index: 1
  Column_name: id
    Collation: NULL
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: dam
   Non_unique: 1
     Key_name: qw
 Seq_in_index: 2
  Column_name: name
    Collation: NULL
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: FULLTEXT
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

猜你喜欢

转载自blog.csdn.net/Ora_G/article/details/108073118