数据库博文汇总
本篇博客旨在更详细简洁的介绍MYSQl索引的相关知识点,包括索引介绍、创建索引和删除索引。文中有详细的源代码作示例,可以粘贴到MYSQL直接运行。
索引简介
- 索引定义:索引是由数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度;
类似于图书的目录,方便快速定位,寻找指定的内容。 - 索引的优缺点 :优点是提高查询数据的速度,缺点是增加了创建和维护索引的时间。
- 索引分类 :
- 普通索引:这类索引可以创建在任何数据类型中;
- 唯一性索引:使用 UNIQUE 参数可以设置,在创建唯一性索引时,限制该索引的值必须是唯一的;
- 全文索引:使用 FULLTEXT 参数可以设置,全文索引只能创建在 CHAR,VARCHAR,TEXT 类型的字段上。主要作用就是提高查询较大字符串类型的速度;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;就是提高查询较大字符串类型的速度;只有 MyISAM 引擎支持该索引,Mysql 默认引擎不支持;
- 单列索引:在表中可以给单个字段创建索引,单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引;
- 多列索引:多列索引是在表的多个字段上创建一个索引;
- 空间索引:使用 SPATIAL 参数可以设置空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数
- 据的效率;只有 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