mysql 联合索引 唯一_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 联合索引和唯一索引相关推荐
- mysql 联合索引 性能_mysql:联合索引及优化
命名规则:表名_字段名 1.需要加索引的字段,要在where条件中 2.数据量少的字段不需要加索引 3.如果where条件中是OR关系,加索引不起作用 4.符合最左原则 尽量不要用or,如果可以用un ...
- mysql复合索引abcac可以索引吗_MySQL联合索引
在一次查询中,MySQL只能使用一个索引. 在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序.分组等. 若表中索引过多,会影响INSERT及UPDATE性能,简单说就是会影 ...
- mysql联合索失效_mysql 联合索引生效的条件、索引失效的条件
1.联合索引失效的条件 联合索引又叫复合索引.两个或更多个列上的索引被称作复合索引. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引 ...
- mysql 联合索引 命中_mysql联合索引命中条件
转于:https://blog.csdn.net/claram/article/details/77574600 首先明确:为什么要用联合索引? 对于查询语句"SELECT E.* FROM ...
- MySQL之事务 索引 锁_MySql 知识点之事务、索引、锁原理与用法解析
本文实例讲述了MySql 知识点之事务.索引.锁原理与用法.分享给大家供大家参考,具体如下: 事务 事务概念 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎执行一组操作语句, ...
- 给mysql添加主键_MySQL添加主键、索引
查看索引 SHOW INDEX FROM 数据库表名 比如:SHOW INDEX FROM order_info; 添加索引 alter table 数据库add index 索引名称(数据库字段名 ...
- mysql中视图备份_MySQL 事务、视图、索引、备份和恢复
事务 为什么需要事务: 转账.总量不变,但其他值进行变化. 事务是什么: 作为单个逻辑工作单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行/不执行. 事务是一个不可分割的工作逻辑单元. ...
- mysql联合索失效_mysql联合索引注意事项,解决为啥联合索引无效的问题
在数据查询的时候合理利用索引才更好地提高查询效率.今天遇到一个数据量不算太大(1000万左右)的表,但是查询特别慢,建立了userid,logtype,fromid 发现索引无效,查阅相关资料后发现联 ...
- mysql复合索引优点_mysql 联合索引有什么好处? 联合索引的意义
mysql 里创建'联合索引'的意义 问题? 因为什么需求,要创建'联合索引'?最实际好处在于什么?如果是为了更快查询到数据,有单列索引不是Ok?为什么有'联合索引'的存在? 简单的说有两个主要原因: ...
最新文章
- JavaScript初学者编程题(11)
- js各种图表组件网站
- Android数据存储之SD卡
- 每日一皮:如何把程序员骗到手!
- 自由自在休闲食品实现奶茶妹的创业梦
- win10系统中查找端口
- 后台服务出现明显“变慢”,谈谈你的诊断思路?
- 有选择性的启用SAP UI5调试版本的源代码
- lightoj 1224
- test libvirt
- django框架之中间件 Auth模块
- 从0开始学习 GitHub 系列之「06.团队合作利器 Branch」
- python标准库——random模块
- 金士顿优盘突然出现写保护,无法删除更改数据也没有办法格式化
- 电商宝:做最懂电商卖家的财务管理“小秘书”
- 应聘阿里的前车之鉴:从被回绝的系列原因出发,解读应聘阿里注意事项
- 在Mac下如何创建文件
- 计算机类sci中接受综述么,SCI期刊接受的5大类型文章
- 开通共享毛巾机小程序
- css——三角形的实现