MYSQL数据库之索引

数据库博文汇总

本篇博客旨在更详细简洁的介绍MYSQl索引的相关知识点,包括索引介绍、创建索引和删除索引。文中有详细的源代码作示例,可以粘贴到MYSQL直接运行。

索引简介

  • 索引定义:索引是由数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度;
    类似于图书的目录,方便快速定位,寻找指定的内容。
  • 索引的优缺点 :优点是提高查询数据的速度,缺点是增加了创建和维护索引的时间。
  • 索引分类 :
  1. 普通索引:这类索引可以创建在任何数据类型中;                    
  2. 唯一性索引:使用 UNIQUE 参数可以设置,在创建唯一性索引时,限制该索引的值必须是唯一的; 
  3. 全文索引:使用 FULLTEXT 参数可以设置,全文索引只能创建在 CHARVARCHARTEXT 类型的字段上。主要作用就是提高查询较大字符串类型的速度;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;就是提高查询较大字符串类型的速度;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;
  4. 单列索引:在表中可以给单个字段创建索引,单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引;
  5. 多列索引:多列索引是在表的多个字段上创建一个索引;
  6. 空间索引:使用 SPATIAL 参数可以设置空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数
  7. 据的效率;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;

创建索引

前文已经说明了,索引的主要优点就是大大提高查询数据的速度,因此本次所选示例的数据很大,直接用SQLyog打开这个db_book.sql文件创建数据库db_book,里面有三个表格 t_book, t_booktype, t_pricelevel。

mysql> use db_book;
Database changed
mysql> select count(*) from t_book;
+----------+
| count(*) |
+----------+
|   110007 |    /*总共110007条数据*/  
+----------+
1 row in set (0.06 sec)/ *可以看到查询花了0.049s*/
mysql> desc t_book;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| bookName   | varchar(20)  | YES  |     | NULL    |                |
| price      | decimal(6,2) | YES  |     | NULL    |                |
| author     | varchar(20)  | YES  |     | NULL    |                |
| bookTypeId | int(11)      | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
mysql> desc t_booktype;
+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| id           | int(11)     | NO   | PRI | NULL    | auto_increment |
| bookTypeName | varchar(20) | YES  | UNI | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> desc t_pricelevel;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| priceLevel  | int(11)      | YES  |     | NULL    |                |
| price       | float        | YES  |     | NULL    |                |
| description | varchar(300) | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)
  • 在已经存在的表上创建索引 :(语法:CREATE [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名ON 表名 (属性名 [(长度)] [ ASC | DESC])
mysql> CREATE INDEX index_bookname ON t_book(bookname); /*在表t_book上创建索引*/
Query OK, 0 rows affected (0.34 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> select count(*) from t_book;
+----------+
| count(*) |
+----------+
|   110007 |
+----------+
1 row in set (0.02 sec)/*速度明显变快了很多,未创建索引之前是0.06s, 创建之后是0.02s*/
mysql> CREATE UNIQUE INDEX index_booktype ON t_booktype(booktypename); /*在t_booktype创建唯一性索引*/
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

  • 创建表的时候创建索引 :(CREATE TABLE 表名 (属性名 数据类型 [完整性约束条件], 属性名 数据类型 [完整性约束条件],.... 属性名 数据类型 [UNIQUE | FULLTEXT | SPATIAL ] INDEX| KEY [别名] (属性名 1 [(长度)] [ASC | DESC]) ) 
mysql> CREATE TABLE test1(
    -> id INT,
    -> price DECIMAL(6,2),
    -> product VARCHAR(20),
    -> INDEX(price) /*普通*/
    -> );
mysql> DROP TABLE IF EXISTS test1; /*存在就删除*/
mysql> CREATE TABLE test1(
    -> id INT,
    -> price DECIMAL(6,2),
    -> product VARCHAR(20),
    -> UNIQUE INDEX(price)/*唯一*/
    -> );
  • ALTER TABLE 语句来创建索引 (语法:ALTER TABLE 表名 ADD [ UNIQUE | FULLTEXT | SPATIAL ] INDEX 索引名 (属性名 [(长度)] [ ASC | DESC])
mysql> ALTER TABLE test1 ADD INDEX index_product(product);/*唯一的直接在 INDEX 前面加 UNIQUE就行了*/
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

删除索引

  • 删除索引(语法:DROP INDEX 索引名 ON 表名 
mysql> DROP INDEX index_product ON  test1;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

猜你喜欢

转载自blog.csdn.net/w_weiying/article/details/80599919
今日推荐