mysql 联合索引和唯一索引
一般来说.如果有where a=? and b=? and c=? 的语句.
如果表也有DML, 我一般只在a 上建索引. 这也是代价平衡的结果. 一方面 只在a 上建索引那么是
index range scan, 不像联合索引那样可以index unique scan , 我觉得速度差的不多(数据量不大的情况).
另一方面,DML也会更新index,更新三个column肯定比更新一个column慢些. 所以我一般采取折中.只建单列或2列索引.
联合索引对于查询
where a=? and b=? and c=?
这样的语句时,速度比分开的索引要快很多!
我现在有一个应用
几乎就是按照这种顺序来查找记录的
所以,我就建立了联合索引
----------------------------------------------------
建立联合索引之后,也不影响你再在这个字段上面创建普通索引。
索引怎么建立,除了你的程序应用,还应当要考虑到表的活动是否频繁,
如果是典型的oltp,索引就不要建立太多,位图索引就不用考虑,
但是dss系统,主要是为了检索,索引多一点就无所谓
联合索引使用结论:
1):查询条件中出现联合索引第一列,或者全部,则能利用联合索引.
2):条件列中只要条件相连在一起,以本文例子来说就是:
last_name=’1′ and first_name=’1′
与
first_name=’1′ and last_name=’1′
,无论前后,都会利用上联合索引.
3):查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,都不会利用联合索引查询.
单一列索引的应用结论:
1):只要条件列中出现索引列,无论在什么位置,都能利用索引查询.
两者的共同点:
1):要想利用索引,都要符合SARG标准.
2) :都是为了提高查询速度.
3):都需要额外的系统开销,磁盘空间.
补充说明: stmtText信息来产生,在查询语句前面加上:SET STATISTICS PROFILE on.可以通过运行它,来观察你的查询是否合理,这样才能真正做到优化.
本文主旨:讨论什么情况下能利用上索引.
索引:创建索引可以根据查询业务的不同分为两种:单一列的索引,联合索引. 顾名思义,单一列索引就是指在表的某一列上创建索引,联合索引是在多个列上联合创建索引.
优缺点比较:
1):索引所占用空间:单一列索引相对要小.
2):索引创建时间:单一列索引相对短.
3):索引对insert,update,delete的影响程序:单一列索引要相对低.
4):在多条件查询时,联合索引效率要高.
索引的使用范围:单一列索引可以出现在where 条件中的任何位置,而联合索引需要按一定的顺序来写.
本文所用测试软件环境如下:SQL05
DEMO:创建一个人员表,包含人员ID,姓名.在人员ID上创建一个聚集索引,在first_name和last_name上创建一个联合
索引.
create table person (id int, last_name varchar(30), first_name varchar(30))
create unique clustered index person_id on person (id)
create index person_name on person (last_name, first_name)
在上例中,id上创建了聚集索引,下面的查询都会用了聚集索引.
where id=1
where id>1
where id<1
where id between 1 and n
where id like ’1%’
where id in(1,2,3…)
说明: id 列出现在条件中的位置并不一定要求第一列,不受位置影响.
不过下面的查询方式则不会用上聚集索引.
where person_id +1=n
where person_id like ‘%5′
where person_id like ‘%5%’
where person_id abs(15)
联合索引列比起单一列索引最大的好处在于,对于多条件的查询它比起单一列索引更加精确.拿上面的人员表来说吧,如果
要查询一个人的全名,只知道first_name是很难马上找到这个人的全名的,如果知道first_name和last_name则会非常容易找到.
下面根据不同的条件与输出列顺序说明索引的应用.
第一种情况:–条件和输出列和索引列顺序相同
select last_name,first_name from person where last_name=’1′ and first_name=’1′
stmtText
Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),
SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@1]
AND [bdg_web_vaction].[dbo].[person].[first_name]=[@2]) ORDERED FORWARD)
结果:利用person_name联合索引查找
第二种情况:–条件列与索引列顺序不同,但输出列相同
select last_name,first_name from person where first_name=’1′ and last_name=’1′
stmtText
Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),
SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@2] AND [bdg_web_vaction].
[dbo].[person].[first_name]=[@1]) ORDERED FORWARD)
结果:利用person_name联合索引查找
第三种情况:–条件列与输出列与索引列的顺序都不相同
select first_name,last_name from person where first_name=’1′ and last_name=’1′
Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),
SEEK:([bdg_web_vaction].[dbo].[person].
[last_name]=[@2] AND [bdg_web_vaction].[dbo].[person].[first_name]=[@1]) ORDERED FORWARD)
结果:利用person_name联合索引查找
第四种情况:–条件列在first_name和last_name中间加入另外一个条件
SELECT id, first_name,last_name from person where first_name=’1′ AND id=1 and last_name=’1′
Clustered Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_id]),
SEEK:([bdg_web_vaction].[dbo].[person].[id]=CONVERT_IMPLICIT(int,[@2],0)),
WHERE:([bdg_web_vaction].[dbo].[person].[first_name]=[@1] AND [bdg_web_vaction].[dbo].[person].[las
结果:不能利用person_name联合索引查找
第五种情况:--在输出列中分开first_name和last_name
SELECT first_name,id,last_name from person where first_name='1' and last_name='1'
Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),
SEEK:([bdg_web_vaction].[dbo].[person].
[last_name]=[@2] AND [bdg_web_vaction].[dbo].[person].[first_name]=[@1])
ORDERED FORWARD)
结果:利用person_name联合索引查找
第六种情况:条件列没有出现联合索引的第一列
SELECT first_name,id,last_name from person where first_name=’1′
SELECT first_name,last_name from person where first_name=’1′
SELECT last_name ,first_name from person where first_name=’1′
Index Scan(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),
WHERE:([bdg_web_vaction].[dbo].[person].[first_name]=[@1]))
结果:不能利用person_name联合索引.
第七种情况:–条件列出现联合索引的第一列
SELECT first_name,id,last_name from person where last_name=’1′
SELECT first_name,last_name from person where last_name=’1′
SELECT last_name ,first_name from person where last_name=’1′
Index Seek(OBJECT:([bdg_web_vaction].[dbo].[person].[person_name]),
SEEK:([bdg_web_vaction].[dbo].[person].[last_name]=[@1]) ORDERED FORWARD)
结果:利用person_name联合索引查找
联合索引使用总结:
1):查询条件中出现联合索引第一列,或者全部,则能利用联合索引.
2):条件列中只要条件相连在一起,以本文例子来说就是:
last_name=’1′ and first_name=’1′
与
first_name=’1′ and last_name=’1′
,无论前后,都会利用上联合索引.
3):查询条件中没有出现联合索引的第一列,而出现联合索引的第二列,或者第三列,都不会利用联合索引查询.
单一列索引的应用总结:
1):只要条件列中出现索引列,无论在什么位置,都能利用索引查询.
两者的共同点:
1):要想利用索引,都要符合SARG标准.
2) :都是为了提高查询速度.
3):都需要额外的系统开销,磁盘空间.
补充说明: stmtText信息来产生,在查询语句前面加上:SET STATISTICS PROFILE on.可以通过运行它,来观察你的查询是否合理,这样才能真正做到优化.
总结:即使表上创建了索引,但如果查询语句写的不科学的话(不符合SARG标准),也于事无补,要根据表索引情况来优化查询语句,如没有合适的索引可用,则要创建相应索引
mysql 联合索引和唯一索引的更多相关文章
- MySQL的几个概念:主键,外键,索引,唯一索引
概念: 主键(primary key) 能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录的唯一和 ...
- Mysql索引介绍及常见索引(主键索引、唯一索引、普通索引、全文索引、组合索引)的区别
Mysql索引概念:说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不是越多越好,假如这本书1000页,有500也是目录,它当然效率低,目录是要 ...
- MySQL 普通索引、唯一索引和主索引
1.普通索引 普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度.因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn ...
- Mysql主键索引、唯一索引、普通索引、全文索引、组合索引的区别
原文:Mysql主键索引.唯一索引.普通索引.全文索引.组合索引的区别 Mysql索引概念: 说说Mysql索引,看到一个很少比如:索引就好比一本书的目录,它会让你更快的找到内容,显然目录(索引)并不 ...
- 【MySQL 读书笔记】普通索引和唯一索引应该怎么选择
通常我们在做这个选择的时候,考虑得最多的应该是如果我们需要让 Database MySQL 来帮助我们从数据库层面过滤掉对应字段的重复数据我们会选择唯一索引,如果没有前者的需求,一般都会使用普通索引. ...
- MySQL 笔记整理(9) --普通索引和唯一索引,应该怎么选择?
笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> (本篇内图片均来自丁奇老师的讲解,如有侵权,请联系我删除) 9) --普通索引和唯一索引,应该怎么选择? 假如你在维护一个市民系统, ...
- MySQL 普通索引和唯一索引的区别
该文为< MySQL 实战 45 讲>的学习笔记,感谢查看,如有错误,欢迎指正 一.查询和更新上的区别 这两类索引在查询能力上是没差别的,主要考虑的是对更新性能的影响.建议尽量选择普通索引 ...
- 如何选择普通索引和唯一索引《死磕MySQL系列 五》
系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
- Sql Server 索引之唯一索引和筛选索引
唯一索引(UNIQUE INDEX) 当主键创建时如果不设置为聚集索引,那么就一定是唯一的非聚集索引.实际上,唯一索引,故名思议就是它要求该列上的值是唯一的.唯一索引能够保证索引键中不包含重复的值, ...
随机推荐
- Ubuntu 安装和使用 Zip – rar – 7zip
http://www.rongxuan.org/2013/08/13/ubuntu-%E5%AE%89%E8%A3%85%E5%92%8C%E4%BD%BF%E7%94%A8-zip-rar-7zip ...
- js 二维码生成 插件
<div onclick="liaotian()">点击生成二维码</div><div id="qrcode"></d ...
- RBAC类的方法
rbac类的 方法 authenticate($map,$model='')方法 传入查询用户的条件和用户表的MODEL 返回数组包含用户的信息 saveAccessList($authId=null ...
- Asp.net MVC 路由基础
路由检测插件RouteDebugger.dll web.config里<appSettings>节点内添加<add key="RouteDebugger:Enabled&q ...
- svn图标不显示的解决方案
最近发现svn图标莫名其妙的不显示,其他操作都正常.在网上搜了一些方法. 解决方法一(失败): 升级最新版本,我的本来就是最新版本 解决方法二(失败): 右键->TortoiseSVN-> ...
- 如何处理C#的HttpWebResponse的GetResponse中的超时异常
程序中,有时会遇到超时的异常,需要进行处理,用一般的try...catch(Exception ex)...会发现ex没有status属性,此时使用WebException捕获异常: try { re ...
- 将本地代码上传至github备份的操作方法
这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三步:填写名称,简介(可选),勾选Initialize this repository with a R ...
- 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目
小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...
- 曲线参数化的Javascript实现(理论篇)
在关键帧动画的制作过程中,动画师在k物体运动的过程中,一般要确定2个参数: 1)运动轨迹(表示物体运动的路径): 2)速度曲线(表示物体随时间的速度变化). 对于运动轨迹通常选用一定的样条曲线,通过动 ...
- NOIP 考前 图论练习
LJOJ 1500: 题目:http://www.docin.com/p-601990756.html Sol:贪心,从叶子结点往上加入无法传递了,就需要建设. Dfs返回的是到达叶子节点最多所要的能 ...