mysql 联合索引 唯一_mysql 联合索引和唯一索引

mysql 联合索引 唯一_mysql 联合索引和唯一索引一般来说.如果有wherea=?andb=?andc=?的语句.如果表也有DML,我一般只在a上建索引.这也是代价平衡的结果.一方面只在a上建索引那么是indexrangescan,不像联合索引那样可以indexuniquescan,我觉得速度差的不多(数据量不大的情况).另一方面,DML也会更新index,更新三个column肯定比更新一个column慢…

大家好,又见面了,我是你们的朋友全栈君。

一般来说.如果有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标准),也于事无补,要根据表索引情况来优化查询语句,如没有合适的索引可用,则要创建相应索引

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/137535.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Wlan与WiFi[通俗易懂]

    Wlan与WiFi[通俗易懂]首先我们简单介绍下WLAN无线上网,其全称是:Wireless Local Area Networks,中文解释为:无线局域网络,是一种利用射频(Radio Frequency RF)技术进行据传输的系统,该技术的出现绝不是用来取代有线局域网络,而是用来弥补有线局域网络之不足,以达到网络延伸之目的,使得无线局域网络能利用 简单的存取架构让用户透过它,实现无网线、无距离限制的通畅网络。WLAN 使用

  • Java数组转List的三种方式及对比

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:大脑补丁 blog.csdn.net/x541211190/article/details/79597236 …

  • [笔记] 使用 opcache 优化生产环境PHP[通俗易懂]

    [笔记] 使用 opcache 优化生产环境PHP

  • springcloud启动错误[通俗易懂]

    springcloud启动错误[通俗易懂]标题:springcloud启动错误AfatalerrorhasbeendetectedbytheJavaRuntimeEnvironment:EXCEPTION_ACCESS_VIOLATION(0xc0000005)atpc=0x0000000000000000,pid=5900,tid=7172JREversion:Java™SERuntimeEnvironment(12.0.2+10)(build12.0.2+10)JavaVM:Jav

  • Python实现久坐提醒小助手程序「建议收藏」

    Python实现久坐提醒小助手程序「建议收藏」不论是日常的工作还是学习,现代年轻人在电脑屏幕时长数据能让人惊掉下巴,继而引发一系列身体不适的现象。小李也是久坐族中的一员,为了时刻提醒自己起来活动活动,我开发了一款基于PythonGU…

  • PriorityQueue(优先级队列总结)

    PriorityQueue(优先级队列总结)一,概念队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列 数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(PriorityQueue)二,PriorityQueue的特性Java集合框架中提供了PriorityQueue和PriorityBlockingQueue两种类型的优先级队列,PriorityQueue是线程不安全的,PriorityBlo.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号