【索引】联合索引的基本知识

0.预备

假设我们有表 user (id,name)列

1.联合索引是个什么东西

  我们知道,对于表的单列(如id)数据,是可以建立索引的,对于多列(id和name组合,或者,name和id组合),也可以建立索引。联合索引,也称之为组合索引。

先来看单列索引的逻辑结构。

  由此得出索引的三个特征:索引有序+高度较低+存储列值

  联合索引也满足这三个特征,但这里的逻辑图就不画了,而是以更直观的方式来展现其查找逻辑,这里应注意,联合索引的列有前后,以id列在前、name列在后为例。

 

建联合索引前的情况

建联合索引后的情况(先按ID排序+再按Name排序)

 

2.建立联合索引的语法

 create index indexName on  tableName(column1,column2,...,columnN),如create idx_un_userid_username on user(id,name)

联合索引可以建立多列(列数大于2)的索引,建议列数最多不要越过3列,超过3列,应重新设计表。

3.联合索引的好处

a:避免回表

在执行计划中,table access by index rowid代表是回表动作。

如在user的id列建有索引,select id from user这个不用回表,直接从索引中读取id的值,而select id,name from user中,不能返回除id列其他的值,所以必须要回表。

如果建有了id和name列的联合索引,则可以避免回表。

另外,建立了id和name的联合索引(id列在在前),则select id from user可以避免回表,而不用单独建立id列的单列索引。

b:两个单列查询返回行较多,同时查返回行较少,联合索引更高效。

如果select * from user where id=2 和select * from user where name=‘tom‘ 各自返回的行数比较多,而select * from user where id=2 and name=‘tom‘返回的行数比较少,那么这个时候使用联合索引更加高效。

4.什么时候该用联合索引以及如何设计组合索引更高效

5.联合索引在DML时候的性能分析

时间: 2024-12-27 16:13:48

【索引】联合索引的基本知识的相关文章

SQL联合索引 与 单一列的索引

SQL联合索引 与 单一列的索引 标签: sqlwebobjectstatistics优化磁盘 2012-06-12 13:46 27992人阅读 评论(1) 收藏 举报  分类: 数据库(94)  转自:http://liqita.iteye.com/blog/1205544 背景:目前WEB的普及太快,很多网站都会因为大流量的数据而发生服务器习惯性死机,一个查询语句只能适用于一定的网络环境.没有优化的查询当遇上大数据量时就不适用了. 联合索引使用结论: 1):查询条件中出现联合索引第一列,或

mysql 联合索引和唯一索引

一般来说.如果有where a=? and b=? and c=? 的语句. 如果表也有DML, 我一般只在a 上建索引.  这也是代价平衡的结果. 一方面 只在a 上建索引那么是 index range scan, 不像联合索引那样可以index  unique scan , 我觉得速度差的不多(数据量不大的情况). 另一方面,DML也会更新index,更新三个column肯定比更新一个column慢些. 所以我一般采取折中.只建单列或2列索引. 联合索引对于查询 where a=? and

mysql:联合索引及优化

命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https://segmentfault.com/q/1010000003984016/a-1020000003984281 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c

MYSQL -- 联合索引

命名规则:表名_字段名1.需要加索引的字段,要在where条件中2.数据量少的字段不需要加索引3.如果where条件中是OR关系,加索引不起作用4.符合最左原则 https://segmentfault.com/q/1010000003984016/a-1020000003984281 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c

Mysql-如何正确的使用索引以及索引的原理

一. 介绍 二. 索引的原理 三. 索引的数据结构 四. 聚集索引与辅助索引 五. MySQL索引管理 六. 测试索引 七. 正确使用索引 八. 联合索引与覆盖索引 九. 查询优化神器-explain 十. 慢查询优化的基本步骤 十一. 慢日志管理 一 .介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到

联合索引在B+树上的存储结构及数据查找方式

能坚持别人不能坚持的,才能拥有别人未曾拥有的.关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 引言 上一篇文章<MySQL索引那些事>主要讲了MySQL索引的底层原理,且对比了B+Tree作为索引底层数据结构相对于其他数据结构(二叉树.红黑树.B树)的优势,最后还通过图示的方式描述了索引的存储结构.但都是基于单值索引,由于文章篇幅原因也只是在文末略提了一下联合索引,并没有大篇幅的展开讨论,所以这篇文章就单独去讲一下联合索引在B+树上的存储结构.本文主要讲解的内容有: 联合索引在B+树

结合mysql查询优化器对联合索引的探讨

无陈述,直接开讲: babysitter_account表中的联合索引如下(开发小伙伴们自建的联合索引.您发现不妥了吗?): KEY `flag` (`flag`,`user_id`,`account_id`) 过去认为: 1.SELECT account_id,weibo_id,weibo_type FROM babysitter_account WHERE user_id BETWEEN 100 and 10000 AND flag=0; 2.SELECT account_id,weibo_

联合索引优化策略

1:索引类型 1.1 B-tree索引 注: 名叫btree索引,大的方面看,都用的平衡树,但具体的实现上, 各引擎稍有不同, 比如,严格的说,NDB引擎,使用的是T-tree Myisam,innodb中,默认用B-tree索引 但抽象一下---B-tree系统,可理解为”排好序的快速查找结构”. 1.2 hash索引 在memory表里,默认是hash索引, hash的理论查询时间复杂度为O(1) 疑问: 既然hash的查找如此高效,为什么不都用hash索引? 答: 1:hash函数计算后的

SQL优化案例分享--联合索引

下面这个SQL如何优化: desc select count(*) as total from Art_Person a, Art_Works b where a.PersonCode=b.PersonCode; +----+-------------+-------+-------+---------------+------------+---------+---------------------+--------+-------------+ | id | select_type | t