精华内容
下载资源
问答
  • 2.如果某2个字段总是成对出现在查询语句里需要建立联合索引,相反的如果这2个字段总是出现在不同的查询语句也就是两者没有什么必然连续无需联合索引 3.联合索引字段的先后顺序ab还是ba看列值选择性好的放前面,所谓...

    索引和联合索引看似很简单但是往往不一定用的对。

    假设数据库2个字段a,b都是查询条件

    第一个问题:是建立2个索引还是一个联合索引?

    第二个问题:如果建立联合索引那么字段的顺序有什么讲究?

     

    原则:

    1.如果需要多个字段唯一健那么需要联合索引

    2.如果某2个字段总是成对出现在查询语句里需要建立联合索引,相反的如果这2个字段总是出现在不同的查询语句也就是两者没有什么必然连续无需联合索引

    3.联合索引字段的先后顺序ab还是ba看列值选择性好的放前面,所谓列值选择性好就是该字段重复的越少越好。

     

    展开全文
  • 上周的时候一个软件开发10多年的...甚至跟我说查聚集索引和联合索引的效果是一样的。 这个误解是跟严重的。要知道数据库的优化做主要的就三点,排序,查询,I/0。回表主要和I/0有关。而I/0是最费资源,时间,cpu,I/O。

    上周的时候一个软件开发10多年的前辈,突然问我他加的数据库索引为啥没用。查询的速度还是那么慢。

    我让他把查询语句,以及建立的索引列发来。

    他在orderid列建立索引,这个方案是没问题的。关键是他犯了好多人犯过的错误。没有考虑到一个关键因素,回表。

    其实我在开发当中很多工作了好多年的前辈,都没有理解回表的重要性。甚至跟我说查聚集索引和联合索引的效果是一样的。

    这个误解是跟严重的。要知道数据库的优化做主要的就三点,排序,查询,I/0。回表主要和I/0有关。而I/0是最费资源,时间,cpu,I/O。这还不算有些大量的随机读,在加上数据量再大些。那简直恐怖的要死,我是真的见过有的工作好多年的前辈写得API来一条数据要几分钟往上。

    什么叫回表????回表是否可以避免??

    首先回表什么是回表。我正好可以举个简单的例子。

    在没有建立索引的情况下,可以看到查询语句也会走索引。这个索引叫做聚集索引,他天生随表而生,他的索引键是主键。也就是说你建表的过程中,建了主键之后就会自动的创建这个聚集索引。他会给全表的数据按主键排个序,放在磁盘里。为什么要有这个主键索引,也就是聚集索引。因为他太重要,关系数据库,没有外键怎么行,有外键没有外键的索引怎么行。还有最基本的排序总要有个排序的标准吧。所以这个聚集索引可以大大的提高数据库的运行效率。

    在没有索引的情况下,默认的会扫描这个索引,然后根据索引找到该行的主键,做I/O查找磁盘的数据。

    那么回表跟这个聚集索引有什么关系。

    首先我们建一个普通索引

    这个索引如果我们用查询语句

    select *
    from core.Material
    where MaterialNumber='YJHLH225'

    是可以用到这个索引的。但是它解决的问题是查找。也就是说我可以用这个索引,像字典的查询字段一样可以查到这个列。

    但是,但是仅仅也是查到。你还没有取啊。还没到磁盘里读取这个数据啊!!!

    怎么办??可以避免去I/0读取这个数据吗??

    也不知道谁想到一个想法,我只想说天才,他把要查找的字段放在索引里!!!!对啊我直接查完索引之后直接返回数据,管你别的干嘛,还去磁盘找数据,找个屁!!天才,真实懒人的天才。但是确实是大大的增强了数据库的查询效率。不得不说简单的道理才是美。

    其实在500年前的明朝也有一个人运用了同样的思想拯救了大明王朝,使大明免受宋朝的复劫。他就是于谦,当时瓦剌入侵大明,俘虏明朝皇帝,兵临北京城下。各路勤王部队进京勤王,粮草成了问题,咋办???于谦的做法是,为啥不让这些勤王士兵自己从驻地带粮过来,于是这些大头兵,每个身上背一代粮食,从驻地出发到北京勤王。这样既解决了兵慌又解决了粮食危机,可谓一箭双雕。联合索引其实就和这个道理一样,本来需要取的数据,我挂在索引上,就解决了去磁盘读数据的步骤。

    展开全文
  • 建立联合索引(name,age)。 理解索引下推、覆盖索引的概念首先要理解,联合索引的普通索引的区别。 比如(name, age) 和 单独name索引的区别。 语句1: select * from user where name = “aaa” and age=10 ...

    Mysql联合索引的使用索引下推、覆盖索引概念

    建立一张user表,id、name、age、address。建立联合索引(name,age)。
    CREATE TABLE user_test (
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(10) DEFAULT NULL,
    age int(10) DEFAULT NULL,
    address varchar(10) DEFAULT NULL,
    PRIMARY KEY (id),
    KEY name (name) USING BTREE,
    KEY name_age (name,age)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

    理解索引下推、覆盖索引的概念首先要理解,联合索引的普通索引的区别。 比如(name, age) 和 单独name索引的区别。
    语句1:
    select * from user_test where name = “aaa” and age=10
    此时用到的索引是联合索引,不过需要回表查询。
    在这里插入图片描述

    语句2:
    select * from user_test where name like “aa%” and age =10
    此时无法在aaa处定位到具体记录,也就是联合索引只用了一般。因为联合索引用完整的条件是,比如(name, age)首先通过name能定位到一类记录,在判断age。如果此时通过name定位到两类记录,那么联合索引只能用到一半,此时就会发生索引下推。
    mysql5.6前,这样的查询需要回表查询,需要一条条重新到聚簇索引定位到主键记录,然后进行判断。
    MySQL 5.6 后,索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表查询需要的次数。在联合索引查询时就做了判断。
    在这里插入图片描述
    注意:这个extra 并没有using where。说明只进行了回表,并没有在server层进行了逻辑判断。
    语句3:
    select name,age from user_test where name like “aa%” and age =10。
    此时这个语句就避免了回表查询,用到了覆盖索引和索引下推。直接在二级索引上,得到需要的数据。
    在这里插入图片描述
    其中 using where , using index . using where && using index. using index condition.区别,下面的博客讲的个人认为比较清晰。
    using where在server 层做了判断, using index 覆盖索引, using where && using index.是在非聚簇索引上,进行了查询,并且在server层做了判断,using index condition是回表查询,也用了索引下推(可能是用到了部分联合索引(name, age)只用到了name和整个联合索引(name,age)), 但是不用在server层做判断。

    https://blog.csdn.net/Saintyyu/article/details/99694649?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1.not_use_machine_learn_pai

    展开全文
  • MySQL联合索引

    2020-09-03 18:26:12
    最左匹配原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。 假设,...

    1、最左匹配原则

    最左匹配原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配

    假设,我们对(a,b)字段建立一个索引,也就是说,你where后条件为:

    a = 1
    a = 1 and b = 2
    

    上面的两个查询条件都是可以走联合索引

    但一定要注意的是

    b= 2 and a =1
    

    也是能匹配到索引的,因为Mysql有优化器会自动调整a,b的顺序与索引顺序一致

    但是如果执行的是:

    b = 2
    

    这个是一定不会走联合索引的

    对(a,b,c,d)建立索引,where后条件为:

    a = 1 and b = 2 and c > 3 and d = 4
    

    那么,a,b,c三个字段能用到索引,而d就匹配不到。因为遇到了范围查询

    2、最左匹配原理

    假设,我们对(a,b)字段建立联合索引,那么入下图所示:
    在这里插入图片描述
    如图所示他们是按照a来进行排序,在a相等的情况下,才按b来排序

    因此,我们可以看到a是有序的1,1,2,2,3,3。而b是一种全局无序局部相对有序状态! 什么意思呢?

    从全局来看,b的值为1,2,1,4,1,2,是无序的因此直接执行b = 2这种查询条件没有办法利用索引

    从局部来看,当a的值确定的时候,b是有序的。例如a = 1时,b值为1,2是有序的状态。当a=2时候,b的值为1,4也是有序状态。 因此,你执行a = 1 and b = 2是a,b字段能用到索引的。而你执行a > 1 and b = 2时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这个范围内b值不是有序的,因此b字段用不上索引

    综上所示,最左匹配原则,在遇到范围查询的时候,就会停止匹配

    3、实例

    3.1、题型一

    如果sql为:

    SELECT * FROM table WHERE a = 1 and b = 2 and c = 3;
    

    如何建立索引?

    如果此题回答为对(a,b,c)建立索引,那都可以回去等通知了此题正确答法是,(a,b,c)或者(c,b,a)或者(b,a,c)都可以(也就是这一题对三个怎么建索引的顺序,是不重要的,因为不管怎么个顺序,优化区都会在执行的时候帮助我们调整顺序,这一题关注的不是顺序,而是要将哪些字段放在前面)重点要的是将区分度高的字段放在前面,区分度低的字段放后面像性别、状态这种字段区分度就很低,我们一般放后面

    例如假设区分度由大到小为b,a,c。那么我们就对(b,a,c)建立索引。在执行sql的时候,优化器会帮我们调整where后a,b,c的顺序,让我们用上索引

    3.2、题型二

    如果sql为:

    SELECT * FROM table WHERE a > 1 and b = 2;
    

    如果此题回答为对(a,b,c)建立索引,那都可以回去等通知了此题正确答法是,对(b,a)建立索引如果你建立的是(a,b)索引,那么只有a字段能用得上索引,毕竟最左匹配原则遇到范围查询就停止匹配如果对(b,a)建立索引那么两个字段都能用上,优化器会帮我们调整where后a,b的顺序,让我们用上索引

    3.3、题型三

    如果sql为:

    SELECT * FROM `table` WHERE a > 1 and b = 2 and c > 3;
    

    如何建立索引? 此题回答也是不一定,(b,a)或者(b,c)都可以要结合具体情况具体分析
    如果a的区分度比较高就采用(b,a),否则就采用(b,c)。

    3.4、题型四

    如果sql为:

    SELECT * FROM `table` WHERE a = 1 ORDER BY b;
    

    如何建立索引? 这还需要想?一看就是对(a,b)建索引,当a = 1的时候,b相对有序,可以避免再次排序! 那么

    SELECT * FROM `table` WHERE a > 1 ORDER BY b;
    

    如何建立索引? 对(a)建立索引,因为a的值是一个范围,这个范围内b值是无序的,没有必要对(a,b)建立索引

    3.4、题型五

    如果sql为:

    SELECT * FROM `table` WHERE a IN (1,2,3) and b > 1;
    

    还是对(a,b)建立索引,因为IN在这里可以视为等值引用,不会中止索引匹配,所以还是(a,b)。

    展开全文
  • 所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。 假设,...
  • Oracle 联合索引

    千次阅读 2012-12-08 09:35:34
    我现在用的是oracle 9i  1.一个表建立多少个索引比较合适?比如说不大于5个   这个没有定论,楼主要综合查询效率和dml... 如果联合索引中的多个字段都在where谓词中出现了,则联合索引效率比单列索引高,因为
  • mysql索引建立规则

    2021-04-23 15:59:02
    比如可以设计一个或者两三个联合索引(尽量少建单值索引),让每一个联合索引都尽量去包含sql语句里的where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原则。 3、不要在小...
  • 所以,我们在建立联合索引的时候,一定要把最常用的列放在最左边。 比如下面的三条语句,能用到联合索引吗? 1)使用两个字段,可以用到联合索引: EXPLAIN SELECT * FROM user_innodb WHERE name= '权亮' AND ...
  • MySQL中的联合索引

    2020-05-23 19:04:00
      所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。 假设...
  • 对多个字段同时建立的索引(有顺序,ABC,CBA是完全不同的两种联合索引); 假设联合索引为age,name,school组合的 其在B+树的结构如下: 联合索引的叶子节点中data数据存储的是主键id;如果要查询语句中查询的是表中...
  • Oracle联合索引

    2015-10-15 22:24:29
    Oracle 联合索引 分类: Oracle 2012-12-08 09:35 2110人阅读 评论(0) 收藏 举报 我现在用的是oracle 9i 1.一个表建立多少个索引比较合适?比如说不大于5个 这个没有定论,楼主要综合查询效率和dml效率自己...
  • 需要对(a,b,c)三列建立联合索引,查询语句为select * from table where a < 100 and b = 100 and c > 100;,由于mysql会对where部分优化,所以a,b,c的顺序不一定。 在建立索引的时候,要按什么顺序呢? 我对...
  • 原则就是如果你的SQL用到了联合索引中最左边的索引,那么这条SQL语句就可以利用这个索引去进行匹配,当遇到范围查找的时候停止匹配 例如 我们对(a,b)字段建立索引,那么当你的的where后的条件为a=1或者a=1 and b=...
  • 数据库触发联合索引的几个条件

    千次阅读 2018-03-19 12:35:29
    本文主要总结查询语句触发联合索引(索引定义中至少包含两个索引列)的几种条件。 示例如下。首先创建表: CREATE TABLE E (e1 INT, e2 VARCHAR(9), e3 INT, PRIMARY KEY(e1, e3)); 这样就建立了一个联合索引:...
  • mysql的联合索引,也称为组合索引,指的是建立一个索引的时候选择多个字段。 可能我们都听说过联合索引的最左匹配原则,今天我们就这个主题实战讨论一下。 使用工具:navicat。 创建表: 我不喜欢上传建表语句,...
  • 这里写自定义目录标题索引过大问题:区分大小写问题: 索引过大问题: 依次执行: show variables like ‘innodb_large_prefix’;...然后注意在建表语句中增加 ROW_FORMAT=DYNAMIC 属性 例:CREATE TABLE u
  • 关于 mysql 联合索引最左匹配原则,是依据 建立索引是各列的位置进行最左匹配原则,而不是根据sql语句中where条件中的列匹配顺序进行匹配(和sql语句条件顺序无关)。 转载于:...
  • 环境 系统:Linux AS3.0+ Oracle 9i RAC Dedicated Server ... 都是varchar2 类型 , 建立index 有c单独索引, a, b ,c 联合索引, 现在有sql 语句 : selectcount(*) fromtab1 where a=:1 and b=:2 a...
  • 所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、<、between、like)就会停止匹配。 假设,...
  • 以前学习这一块的时候,是说:假设建立联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引。 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化。 下面是我的实测结果:...
  • 以前学习这一块的时候,是说:假设建立联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引。 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化。 下面是我的实测结果...
  • mysql数据库中一张user表中,其中包含字段A,B,C,字段类型如下:A:int,B:int,C:int根据字段A,B,C按照ABC顺序建立复合索引idx_A_B_C,以下查询语句中使用到索引idx_A_B_C的语句有哪些?  (ABD) select *from user ...
  • mysql表添加联合唯一索引

    千次阅读 2016-06-08 17:49:08
    在开发过程中遇到了联合...因此需要针对这两个字段建立联合索引。 表名称为:sc_blacklistcity 两个字段分别为:province city 执行语句: alter table `sc_blacklistcity` add unique index(province,city);
  • 非聚集索引:Myisan引擎为非聚集索引,索引文件在...索引覆盖:走二级索引,再走主键索引,走两次B+tree,性能下降,需要覆盖索引,即建立联合索引,把需要的信息联合建立索引,这样叫做索引覆盖; 关于一级索引的建.
  • 建立数据库表的时候,建立索引,能帮助我们提升查询速度,在MyISAM和... 在建立索引的时候,要考虑索引的最左匹配原则(在使用SQL语句时,如果where部分的条件不符合最左匹配原则,可能导致索引失效,或者不能完全
  • 1、大表的数据多时,用alter语句建立分区会非常慢,建议先 create table Tem like Origin;...2、表中数据量大时,若表中存在惟一索引会非常慢,联合索引、惟一索引和单一字段分别索引导入数据耗时如
  • MySQL 索引

    2021-01-30 10:01:41
    那你们在创建联合索引的时候,需要做联合索引多个字段之间顺序你们是如何选择的呢? 你知道在MySQL 5.6中,对索引做了哪些优化吗? 你们创建的那么多索引,到底有没有生效,或者说你们的SQL语句有没有使用索引查询...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 274
精华内容 109
关键字:

联合索引建立语句