索引之单列索引和组合索引

前几天老大叫我做了下索引优化,故将学到的东西记录下来。

1)单列索引就不多说了,不设限制的唯一索引,值唯一的唯一索引,一个表一个非空的主键索引

2)组合索引

组合索引,多个列组合的索引。重点是理解最左前缀的原则。

最左前缀

若有组合索引(a,b,c),那么根据最左前缀,数据库成立了三个索引(a)(a,b)(a,b,c),

重点:

这里可以看出n个列的组合索引,实际新建的普通

索引是n个,

索引的列数是n(n+1)/2列,即高斯求和

大小是n*a*a.length+(n-1)*b*b.lengtn+....+1*n*n.length。

3)优化

有了上面的重点,那么建立索引的基本要求就有了。

1.索引的大小应该小于数据表的大小

因为,每个数据不一定用的是最大的长度,而且建立索引的时间高于插入数据,实际上通常满足索引的列数小于数据库的列数,就能确保索引的大小应该小于数据表的大小。当然,具体公司具体分析,像淘宝的数据服务器估计为了查询速度,索引大小应该远高于数据表大小。

2.组合索引第一个不应该包含单列索引

原因,重复。(学名组合索引的前导索引/前导列)

3.创建索引时,若一些用于模糊查询的可以只截前面一段,用于查询

优化索引创建时间,索引大小等

4)注意点

1.操作:order by,where,join,查询条件:数据库只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引

2.以通配符%和_开头作查询时,MySQL不会使用索引

3.索引不会包含有NULL值的列

4.在索引列上进行数学操作会变成全表查询

5.不用NOT IN和<>操作,想想就明白,这两个操作下的查询效率和全表查询差不多。

原文地址:https://www.cnblogs.com/ydymz/p/9167510.html

时间: 2024-10-27 21:32:29

索引之单列索引和组合索引的相关文章

MySQL单列索引和组合索引的区别介绍(转)

原文:http://database.51cto.com/art/201011/233234.htm MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表: CREATE TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_Cit

MySQL单列索引和组合索引的区别介绍

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表: CREATE TABLE myIndex (      i_testID INT NOT NULL AUTO_INCREMENT,      vc_Name VARCHAR(50) NOT NULL,      vc_City VARCHAR(50) NOT NULL,      i_Age I

mysql组合索引与字段顺序

很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子:假设有一张订单表(orders),包含order_id和product_id二个字段.一共有31条数据.符合下面语句的数据有5条.执行下面的sql语句: 1 2 3 select product_id from orders where order_id in (123, 312, 223, 132, 22

使用组合索引的注意事项

索引的原理与作用,各种书籍和网络上的介绍可以说是铺天盖地,基本上主流数据库系统的也都是一致的.选择索引字段的原则,比如外键字段.数据类型较小的字段.经常用于查询或排序的字段.表关联的字段等等,在此不做赘述.本人在工作中见到过很多人创建的索引,回想自己以前也会有理论知识空洞的体会,总感觉理论知识无法与具体的工作问题相匹配.在此仅以工作学习中积累的一点经验和问题场景整理以飨读者.先把常见的注意事项整理如下: 索引应该建在选择性高的字段上(键值唯一的记录数/总记录条数),选择性越高索引的效果越好.价值

sql server中使用组合索引需要注意的地方

一.使用组合索引需要注意的地方 1.索引应该建在选择性高的字段上(键值唯一的记录数/总记录条数),选择性越高索引的效果越好.价值越大,唯一索引的选择性最高: 2.组合索引中字段的顺序,选择性越高的字段排在最前面:如果把低选择性的列放在最左端,可能会造成无法使用该索引的情况. 3.where条件中包含两个选择性高的字段时,可以考虑分别创建索引,引擎会同时使用两个索引(在OR条件下,应该说必须分开建索引): 4.不要重复创建彼此有包含关系的索引,如index1(a,b,c) .index2(a,b)

[转]mysql组合索引与字段顺序

下列转自:http://www.tech-q.cn/archiver/tid-11673.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序不符. 看下面的例子:假设有一张订单表(orders),包含order_id和product_id二个字段.一共有31条数据.符合下面语句的数据有5条.执行下面的sql语句: select product_id from orde

【转】MYSQL数据库四种索引类型的简单使用--MYSQL组合索引“最左前缀”原则

MYSQL数据库索引类型包括普通索引,唯一索引,主键索引与组合索引,这里对这些索引的做一些简单描述: (1)普通索引 这是最基本的MySQL数据库索引,它没有任何限制.它有以下几种创建方式: 创建索引 CREATE INDEX indexName ON mytable(username(length)); 如果是CHAR,VARCHAR类型,length可以小于字段实际长度:如果是BLOB和TEXT类型,必须指定 length,下同. 修改表结构 ALTER mytable ADD INDEX

索引合并和组合索引的比较 (转)

在教务系统补考子系统的开发过程中,安排考场的算法运算时间非常慢,需要32秒才能完成考场的分配.查找原因,由于需要在学生补考科目表里面进行查找数据——该表的数据目前已达200万条,所以算法的大部分时间都花在查找数据方面.为了解决以上问题,我们决定对数据表进行分析,创建合适的索引. 在创建索引过程中,我们发现查询语句已经为查询列创建了索引,但是是为每个列单独创建的——SELECT  *  FROM TABLE_NAME  WHERE COL1=’ABC’  AND  COL2=123; 为了重点说明

Oracle索引总结(四)- Oracle索引种类之位图索引

位图索引 1.1 位图索引概述 位图索引通过位图向量,表示索引键值在表中的分布. 适用于没有大量更新操作的对象,如:OLAP数据库. 对于存在大量更新操作的索引列,不适用位图索引.因此对于OLTP并不适用. 更新位图向量时,相应位图涉及的所有数据行会被锁定,无法针对这些数据行的该索引列进行DML操作. 1.2 位图索引结构的说明 与B-tree索引的联系及区别如下: 与B-tree索引的联系:位图索引使用B-tree形式组成. 与B-tree索引的区别:位图索引的一个索引键值对应一个叶子节点.(

Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内容用于商业用途,将保留追究其法律责任的权利.如果有问题,请以邮箱方式联系作者([email protected]). 理解oracle索引扫描类型的特点以及具体触发的条件,对于通过合理地使用索引,进行sql优化至关重要(例如组合索引的引导列的选择问题). 在总结索引扫描类型前,需要再次强调关于索引特