索引是一种特殊的数据结构,可以用来快速查询数据库的特定记录,建立是一中提高数据库性能的重要方式。
内容:索引的意义,索引的设计,创建和删除
索引简介
索引是建立在表上的,有一列或者多列组成,并对这一列或者多列进行排序的一种结构。
所有存储引擎对每个表至少支持16个索引,总索引长度至少为256字节,索引有两种存储类型,包括B型树索引和哈希索引。
索引的优点是可以提高检索的速度,但是创建和维护索引需要耗费时间,这个时间随着数据量的增加而增加。
索引可以提高查询的速度,但是会影响插入的速度,当要插入大量的数据时,最好的办法是先删除索引,插入数据后再建立索引。
MySQL的索引分为:普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引。
目前只有MyISAM存储引擎支持全文索引,InnoDB引擎还不支持全文索引。
索引的设计原则
- 选择唯一性索引。
- 为经常需要排序,分组和联合操作的字段建立索引。
- 为常作为查询条件的字段建立索引。
- 限制索引的数目。
- 尽量使用数据量少的索引。
- 尽量使用前缀来索引。如果字段的值很长,最好使用值的前缀来索引,如果只检索子酸的前面的若干字符,可以提高检索的速度。
- 删除不再使用或者很少使用的索引。
原则只是参考而不能拘泥。
创建索引
三种方式:在创建表是创建索引,在已存在的表上创建索引和使用alter table语句创建索引。
mysql> show tables;
+----------------+
| Tables_in_kiwi |
+----------------+
| stu |
+----------------+
1 row in set (0.00 sec)
mysql> create table indexTest(id int, name varchar(20), sex boolean, index index_id(id));
Query OK, 0 rows affected (0.08 sec)
mysql> desc indextest;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | tinyint(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> explain select * from indextest where id = 1 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: ref
possible_keys: index_id
key: index_id
key_len: 5
ref: const
rows: 1
Extra: Using where
1 row in set (0.00 sec)
+----------------+
| Tables_in_kiwi |
+----------------+
| stu |
+----------------+
1 row in set (0.00 sec)
mysql> create table indexTest(id int, name varchar(20), sex boolean, index index_id(id));
Query OK, 0 rows affected (0.08 sec)
mysql> desc indextest;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | MUL | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | tinyint(1) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> explain select * from indextest where id = 1 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: indextest
type: ref
possible_keys: index_id
key: index_id
key_len: 5
ref: const
rows: 1
Extra: Using where
1 row in set (0.00 sec)
创建单列索引,subject(10)是为了不查询全部信息而提高检索的速度。
mysql> create table singleRow(id int,name varchar(20),subject varchar(30),index index_st(subject(10)));
Query OK, 0 rows affected (0.17 sec)
mysql> show create table singlerow\G;
*************************** 1. row ***************************
Table: singlerow
Create Table: CREATE TABLE `singlerow` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`subject` varchar(30) DEFAULT NULL,
KEY `index_st` (`subject`(10))
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
多列索引,空间索引类似。
在已存在的表上建立索引
语法为: create [unique|fulltext|spatial] index index_name on table_name (property_name[length] [asc|desc]);
mysql> desc stu;
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| s_num | int(10) | YES | MUL | NULL | |
| course | varchar(20) | YES | | NULL | |
| score | varchar(4) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.05 sec)
mysql> show create table stu \G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`s_num` int(10) DEFAULT NULL,
`course` varchar(20) DEFAULT NULL,
`score` varchar(4) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `index_id` (`id`),
KEY `grade_fk` (`s_num`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
+--------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------+-------------+------+-----+---------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| s_num | int(10) | YES | MUL | NULL | |
| course | varchar(20) | YES | | NULL | |
| score | varchar(4) | YES | | NULL | |
+--------+-------------+------+-----+---------+----------------+
4 rows in set (0.05 sec)
mysql> show create table stu \G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`s_num` int(10) DEFAULT NULL,
`course` varchar(20) DEFAULT NULL,
`score` varchar(4) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
UNIQUE KEY `index_id` (`id`),
KEY `grade_fk` (`s_num`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
使用alter table创建索引
语法为:
alter table table_name add [unique|fulltext|spatial] index index_name(property_name[length] [asc|desc]);
mysql> create table index_1(id int, name varchar(20), class int);
Query OK, 0 rows affected (0.11 sec)
mysql> show tables;
+----------------+
| Tables_in_kiwi |
+----------------+
| index_1 |
| singlerow |
| stu |
+----------------+
3 rows in set (0.00 sec)
mysql> show create table index_1 \G;
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> alter table index_1 add fulltext index index_alter (name desc);
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
mysql> alter table index_1 engine=myisam;
Query OK, 0 rows affected (0.36 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table index_1 add fulltext index index_alter (name desc);
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table index_1 \G;
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL,
FULLTEXT KEY `index_alter` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.11 sec)
mysql> show tables;
+----------------+
| Tables_in_kiwi |
+----------------+
| index_1 |
| singlerow |
| stu |
+----------------+
3 rows in set (0.00 sec)
mysql> show create table index_1 \G;
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> alter table index_1 add fulltext index index_alter (name desc);
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
mysql> alter table index_1 engine=myisam;
Query OK, 0 rows affected (0.36 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> alter table index_1 add fulltext index index_alter (name desc);
Query OK, 0 rows affected (0.13 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table index_1 \G;
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL,
FULLTEXT KEY `index_alter` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
删除索引
语法:
drop index index_name on table_name;
mysql> show create table index_1 \G;
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL,
FULLTEXT KEY `index_alter` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> drop index index_alter on index_1;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table index_1 \G;
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL,
FULLTEXT KEY `index_alter` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> drop index index_alter on index_1;
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> show create table index_1 \G;
*************************** 1. row ***************************
Table: index_1
Create Table: CREATE TABLE `index_1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`class` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
相关推荐
总的来说,为MySQL数据库建立索引是一个涉及性能优化的关键环节。正确地设计和使用索引可以大幅提升查询效率,减少数据库服务器的负载,进而提高整体系统性能。但同时,索引也会占用存储空间,并在插入、更新和删除...
创建好`Document`后,将其添加到`IndexWriter`,这样Lucene就会为这些字段建立索引。 当索引构建完成后,我们就可以实现搜索功能了。首先,创建一个`DirectoryReader`来读取已经建立的索引,然后使用`IndexSearcher...
以下是关于MySQL建立索引的详细说明、优缺点以及常见使用方法。 **一、索引的作用** 索引的主要目的是提高数据检索速度。它类似于书籍的目录,允许数据库系统快速定位所需的数据行,而无需遍历整个表。以下是索引的...
例如,如果查询多涉及时间戳字段,可以针对该字段建立索引,以加快查询速度。但是,索引并非没有代价,它们占用磁盘空间,并可能影响插入和更新操作的速度。对于 InnoDB 引擎,当表空间文件(ibdata1)过大且无法...
代码复制粘贴 改下里面的参数 就可以用 而且参数 也有说明 简单易懂
在本文中,我们将详细介绍如何为MySQL数据库建立索引,包括单字段索引、多字段索引、组合索引和ORDER BY索引等。同时,我们还将介绍使用EXPLAIN命令来测试数据库是否真正使用了这些索引。 单字段索引 ------------ ...
MySQL 索引类型大汇总 ...* 对插入、更新、删除操作频繁的字段建立索引 * 对查询条件中使用的字段建立索引 索引是 MySQL 数据库性能优化的关键所在,合理的使用索引可以提高查询速度,提高数据库的高效运行。
索引的建立对于MySOL的高效运行是很重要的,索引可以大大提高MvSOL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是...建立索引会占用磁盘空间的索引文件
同时,避免在经常更新的列上建立索引,因为这会增加写操作的复杂性。 关于存储过程,它们是一组预先编译的SQL语句,可以在需要时重复调用,以提高执行效率。存储过程可以封装复杂的业务逻辑,减少网络通信,提高...
### MySQL数据库及索引详解 #### 一、MySQL简介与数据库发展 MySQL是一款非常流行的开源关系型数据库管理系统,由瑞典MySQL AB公司开发。它以其高性能、稳定性和易用性著称,广泛应用于Web应用程序和企业级系统中...
在未建立索引的情况下,MySQL需要遍历整个表才能找到符合条件的记录;而一旦对`name`列创建了索引,MySQL则能够直接根据索引快速定位到目标记录,从而大大减少了查询时间。 #### 四、索引的类型 MySQL提供了多种...
在数据库表中,对字段建立索引可以大大提高查询速度。假如我们创建了一个 mytable表: CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL ); 我们随机向里面插入了10000条记录,...
使用索引时应遵循一定的原则,如避免在频繁更新的列上创建过多索引,对常用于查询的字段建立索引,数据量小的表通常无需索引,以及在区分度高的列上建立索引等。 3. **索引的分类**: - **单列索引**:包括普通...
这是因为对于小表,全表扫描的代价相对较低,而建立和使用索引的开销可能超过其带来的益处。 总之,MySQL索引优化涉及到对查询语句的理解、索引设计的合理性以及根据数据量和查询模式选择合适的索引使用策略。在...
### MySQL索引、锁与事务详解 #### 一、索引 **索引定义与作用:** 索引是一种数据结构,用于加速数据检索的过程。它通过建立数据表中某些列的值与行的位置之间的映射关系,使得数据库系统能够快速定位到所需的...
由于排序字段`name`没有建立索引,上述查询可能导致MySQL优化器选择全表扫描而非索引扫描,因为全表扫描的成本可能比遍历多个索引树更低。在这种情况下,我们可以通过先通过`ORDER BY name`获取主键,然后根据这些...