数据库索引
索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。
适合建立索引的列:
1. 在经常需要搜索(where语句)的列上,可以加快搜索的速度
2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构
3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度
4. 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的
5. 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间
不适合建立索引的列:
1. 在查询中很少使用或者参考的列
2. 只有很少数据值的列。由于这些列的取值很少,例如性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
3. 定义为text, image和bit数据类型的列。这些列的数据量要么相当大,要么取值很少,不利于使用索引。
4. 当修改性能远远大于检索性能时,不应该创建索引。因为修改性能和检索性能是互相矛盾、此消彼长的。
建立索引的负面影响:
1. 增加了数据库的存储空间
2. 在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
索引的类型:
1. 唯一索引:不允许其中任何两行具有相同索引值。
2. 主键索引:在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型,主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
3. 聚集索引:表中行的物理顺序与键值的逻辑(索引)顺序相同。
一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。
SELECT * FROM mytable WHERE category_id=1;
建立索引:CREATE INDEX mytable_categoryid ON mytable (category_id);
SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
建立多重索引:CREATE INDEX mytable_categoryid_userid ON mytable(category_id,user_id);