索引是一种特殊的数据结构,可以用来快速查询数据库的特定记录,建立是一中提高数据库性能的重要方式。
内容:索引的意义,索引的设计,创建和删除
索引简介
索引是建立在表上的,有一列或者多列组成,并对这一列或者多列进行排序的一种结构。
所有存储引擎对每个表至少支持16个索引,总索引长度至少为256字节,索引有两种存储类型,包括B型树索引和哈希索引。
索引的优点是可以提高检索的速度,但是创建和维护索引需要耗费时间,这个时间随着数据量的增加而增加。
索引可以提高查询的速度,但是会影响插入的速度,当要插入大量的数据时,最好的办法是先删除索引,插入数据后再建立索引。
MySQL的索引分为:普通索引,唯一性索引,全文索引,单列索引,多列索引和空间索引。
目前只有MyISAM存储引擎支持全文索引,InnoDB引擎5.6以下版本还不支持全文索引。则需要升级mysql。例如:从5.1升级到5.5,再升级到5.6版本。详细见mysql手册。http://dev.mysql.com/doc/refman/5.6/en/upgrading.html
索引的设计原则
- 选择唯一性索引。
- 为经常需要排序,分组和联合操作的字段建立索引。
- 为常作为查询条件的字段建立索引。
- 限制索引的数目。
- 尽量使用数据量少的索引。
- 尽量使用前缀来索引。如果字段的值很长,最好使用值的前缀来索引,如果只检索子酸的前面的若干字符,可以提高检索的速度。
- 删除不再使用或者很少使用的索引。
原则只是参考而不能拘泥。
创建索引
三种方式:在创建表是创建索引,在已存在的表上创建索引和使用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)
相关推荐
为什么不对没一列创建索引 减少开销 覆盖索引 效率高 减少开销:假如对col1、col2、col3创建组合索引,相当于创建了(col1)、(col1,col2)、(col1,col2,col3)3个索引 覆盖索引:假如查询SELECT col1, col2...
在索引优化方面,最左前缀原则是一个关键概念,这意味着复合索引只能按照索引创建时列的顺序部分使用,例如,INDEX(A, B, C)可以用于 WHERE A = x 或 WHERE A = x AND B = y 的查询,但不能单独用于 WHERE B = y 或 ...
除了创建索引,索引管理还包括删除。在MySQL中,可以使用`DROP INDEX`语句来删除索引。但是,需要注意的是,如果索引与主键关联,必须先删除主键,再删除主键索引。 索引的失效场景包括:更新或删除索引列,使用不...
- **按需创建索引**:不是所有的字段都需要建立索引。应根据查询需求和表结构来决定哪些字段应该被索引。 - **复合索引策略**:当一个查询涉及多个字段时,可以考虑创建复合索引以减少索引的数量,并提高查询效率。 ...
这个原则指出,当创建一个包含多个列的联合索引时(例如,KEY test_col1_col2_col3 ON test(col1, col2, col3)),MySQL会在查询时从索引的最左侧列开始匹配,依次向右。这意味着,如果查询条件包含了索引的最左侧列...
关于mysql索引一些优化介绍与创建原则,还有对order by排序的算法的介绍等等
- **优点**:可以给任何列创建索引,提升查询速度。 - **缺点**:创建和维护索引需要时间,占用额外存储空间,且影响数据的增删改操作速度。 使用索引时应遵循一定的原则,如避免在频繁更新的列上创建过多索引...
这时,我们可以为`ds_order`表中的`user_id`字段创建索引,提高查询效率。 ```sql CREATE TABLE `ds_order` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键 id', `user_id` int(11) NOT NULL COMMENT '...
1.创建索引 代码如下: CREATE INDEX indexName ON mytable(username(length)); 如果是 CHAR,VARCHAR 类型,length 可以小于字段实际长度;如果是 BLOB 和 TEXT 类型,必须指定 length,下同。 2.修改表结构 代码如
如果新索引是现有多列索引的最左前缀,那么就没有必要单独为前面的列创建索引,因为这不会提供额外的性能提升。 举例来说,如果我们有一个名为`people`的表,包含`lname`、`fname`和`age`三列,若要查询姓`Liu`、名...
应为区分度高的列创建索引。 2. 索引覆盖:如果查询只涉及到索引中的列,MySQL和Oracle都可能避免全表扫描,提高性能。 3. 避免空值索引:空值在索引中占特殊位置,可能导致索引效率下降。 4. 索引维护:定期分析...
对于小表或包含大量列且无需搜索非空值的表,可以考虑不创建索引。 了解MySQL的索引类型也很关键。主键(Primary Key)索引具有唯一性和非空性,一张表只能有一个主键;唯一键(Unique Key)索引允许为空,但字段值...
MySQL索引最左原则是指在MySQL数据库中,利用复合索引时,查询条件要尽量匹配索引的最左边字段,这样才能有效地利用索引,加快查询速度。理解最左原则对于优化数据库查询性能至关重要。 首先,当我们创建复合索引时...
在最左前缀匹配原则下,如果查询条件匹配索引的最左边一列或多列,数据库可以利用该索引。在示例SQL中,创建一个包含`status`, `operator_id`, `type`, `operate_time`的联合索引,并且考虑到`operate_time`的范围...
创建索引可以在创建表的时候创建,也可以在创建表之后创建。创建索引的基本语法格式如下: ``` CREATE TABLE table_name [col_name data_type] [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name...
11.MySQL高级索引索引设计原则.avi 12.MySQL高级视图概述.avi 13.MySQL高级视图创建及修改视图.avi 14.MySQL高级视图查看及删除视图.avi 15.MySQL高级存储过程概述.avi 16.MySQL高级存储过程创建调用查询删除语法....
例如,在一个包含身份证号的列上创建索引通常比在一个性别列上创建索引效果更好,因为身份证号的重复率远低于性别。在`test_t`表的`num`和`d_num`列上创建索引可能会提高查询速度。 2. **考虑查询需求**: 应该...
├ 第一天视频 │ │ 01.... MySQL 高级 - 索引 - 索引设计原则.avi │ │ 12. MySQL 高级 - 视图 - 概述.avi │ │ 13. MySQL 高级 - 视图 - 创建及修改视图.avi │ │ 14. MySQL 高级 - 视图 - 查看及删