精华内容
下载资源
问答
  • mysql in索引

    千次阅读 2018-11-06 16:52:37
    当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引

    当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引。

    展开全文
  • mysql 多列索引多个单列索引

    万次阅读 2013-07-05 11:01:51
    现在有个问题,如果一个表有多个列需要建立索引,是把所有列建成一个索引,还是对每一个列建一个索引,上篇文章做了一个介绍,这是作者得出的结论,Conclusion: For benchmarked queries we can see Multiple ...
    对于要经常查询的含量大量数据的数据库,建立索引是非常重要的,建立索引一般都是在where语句用得较多的列上。现在有个问题,如果一个表有多个列需要建立索引,是把所有列建成一个索引,还是对每一个列建一个索引,上篇文章做了一个介绍,这是作者得出的结论,Conclusion: For
     benchmarked queries we can see Multiple Column index beats Index Merge in all cases when such index can be used. It is also worth to watchout a MySQL may decide not to do Index merge (either intersection or union) but instead do full table scan or access table
     picking only one index on the pair.意思应该是说对多个列建索引比对每个列分别建索引更有优势,而且要知道索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢。


    另外一篇文章How to create a successful multi-column index 则介绍了如何去建立一个多列索引,最重要的一个问题是如何安排列的顺序是至关重要的,比如需要对一个表里面的两个字段foo,bar建一个索引,那么索引的顺序是(foo,bar)还是(bar,foo)呢。在搞清楚如何安排顺序之前先了解一个概念,cardinality:金山的翻译是"集的势",比如,tb表有1700条记录,foo字段有750个不同的记录,那么就可以说We have a cardinality of 750 for foo。总规则可以说是cardinality越大的字段应该排在索引的第一位就是说索引的位置是(foo,bar),因为cardinality越大那么第一次取出来的记录集就越小,再进行第二次查询的次数就越少了。不过这只是对于建两个索引的规则,如果是三个以上就没有那么简单了,具体地看原文,有比较详细的例子。还需要提出的是即使我们建了一个很有效的索引,但是查询优化器也许会选择不用它,如果它会考虑更多因素以决定这个索引是否有足够的效率。It was also pointed out to me, that even if an efficient multi-column index is created, the query optimizer may choose to never use it. This is 
    because the optimizer looks at further statistics to determine if the index would be 
    efficient enough or not.


    另外,还可以参考一下mysql的官方文档,http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html,也有比较详细的介绍mysql如何使用索引的,只是都是e文,慢慢啃就好了。
    展开全文
  • Elasticsearch查询多个索引

    千次阅读 2020-10-19 07:18:25
    为什么要使用多个索引? 您可能有多个原因,可能会对Elasticsearch集群中的给定应用程序使用多个索引。最受欢迎的事实之一是删除索引非常有效(而删除许多文档则效率不高)。如果您的应用程序经常添加和删除数据,...

    为什么要使用多个索引?

    您可能有多个原因,可能会对Elasticsearch集群中的给定应用程序使用多个索引。最受欢迎的事实之一是删除索引非常有效(而删除许多文档则效率不高)。如果您的应用程序经常添加和删除数据,这将很有用。例如,如果您的应用程序最近100天在Elasticsearch中保持数据,则可以每周将数据划分为一个索引。这种方法非常有效,可以在大约15个索引中进行搜索以查询全部100天,这是一个适度的折衷方案。

    另一个示例是多租户应用程序(例如,类似Gmail的应用程序),其中每个用户的数据都存储在单个索引中。这使您可以独立缩放每个索引。

    在需要查询多个索引的情况下,Elasticsearch通过允许您指定搜索的范围以包括多个索引(以逗号分隔的列表,基于正则表达式或其他方便选项的方式)来简化此操作。也一样

    假设一个方案每周使用一个索引,下面是一些示例,搜索带有“ dremio”标签的文档:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    # search a specific index

    curl -XGET 'localhost:9200/2017-week47/_search?q=tag:dremio'

     

    # search specific year

    curl -XGET 'localhost:9200/2017-*/_search?q=tag:dremio'

     

    # search a specific week across all years (eg, holidays)

    curl -XGET 'localhost:9200/*-week51/_search?q=tag:dremio'

     

    # search across all weeks

    curl -XGET 'localhost:9200/_all/_search?q=tag:dremio'

     

    # search across all weeks, except Christmas week

    curl -XGET 'localhost:9200/+_all,-*week51/_search?q=tag:dremio'

     

    # In case you are using types, the same idea applies to types:

     

    # search across users and orders, for all weeks, except Christmas week

    curl -XGET 'localhost:9200/+_all,-*week51/users,orders/_search?q=tag:dremio'

     

    展开全文
  • 一、可以创建多个索引嘛? 可以创建多个索引的。 需要开发人员根据实际的用途以及数据库中记录的情况,来进行判断。 通常来说,表的索引越多,其查询的速度也就越快。但是,表的insert/update速度则会降低。这主要是...

    一、可以创建多个索引嘛?

    可以创建多个索引的。
    需要开发人员根据实际的用途以及数据库中记录的情况,来进行判断。

    通常来说,表的索引越多,其查询的速度也就越快。但是,表的insert/update速度则会降低。这主要是因为,在更新记录的同时需要更新相关的索引信息。为此,到底在表中创建多少索引合适,就需要在这个更新速度与查询速度之间取得一个均衡点。

    如对于一些数据仓库数据库系统,其主要用来进行查询。相关的记录往往是在数据库初始化的时候倒入。此时,设置的索引多一点,可以提高数据库的查询性能。同时因为记录不怎么更新,所以索引比较多的情况下,也不会影响到更新的速度。即使在起初的时候需要导入大量的数据,此时也可以先将索引禁用掉。等到数据导入完毕后,再启用索引。可以通过这种方式来减少索引对数据更新的影响。

    如果那些表中经常需要更新记录,如一些事务型的应用系统,数据更新操作是家常便饭的事情。此时如果在一张表中建立过多的索引,则会影响到更新的速度。由于更新操作比较频繁,所以对其的负面影响,要比查询效率提升要大的多。此时就需要限制索引的数量,只在一些必要的字段上建立索引。

    二、创建索引

    1.ALTER TABLE

    ALTER TABLE用来创建普通索引、UNIQUE索引或PRIMARY KEY索引。

    ALTER TABLE table_name ADD INDEX index_name (column_list)

    ALTER TABLE table_name ADD UNIQUE (column_list)

    ALTER TABLE table_name ADD PRIMARY KEY (column_list)

    其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。

    2.CREATE INDEX

    CREATE INDEX可对表增加普通索引或UNIQUE索引。

    CREATE INDEX index_name ON table_name (column_list)

    CREATE UNIQUE INDEX index_name ON table_name (column_list)

    table_name、index_name和column_list具有与ALTER TABLE语句中相同的含义,索引名不可选。另外,不能用CREATE INDEX语句创建PRIMARY KEY索引。

    三、索引类型

    在创建索引时,可以规定索引能否包含重复值。如果不包含,则索引应该创建为PRIMARY KEY或UNIQUE索引。对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。

    PRIMARY KEY索引和UNIQUE索引非常类似。
    事实上,PRIMARY KEY索引仅是一个具有名称PRIMARY的UNIQUE索引。这表示一个表只能包含一个PRIMARY KEY,因为一个表中不可能具有两个同名的索引。

    下面的SQL语句对students表在sid上添加PRIMARY KEY索引。
    ALTER TABLE students ADD PRIMARY KEY (sid)

    四、删除索引

    可利用ALTER TABLE或DROP INDEX语句来删除索引。类似于CREATE INDEX语句,DROP INDEX可以在ALTER TABLE内部作为一条语句处理,语法如下。

    DROP INDEX index_name ON talbe_name

    ALTER TABLE table_name DROP INDEX index_name

    ALTER TABLE table_name DROP PRIMARY KEY

    其中,前两条语句是等价的,删除掉table_name中的索引index_name。

    第3条语句只在删除PRIMARY KEY索引时使用,因为一个表只可能有一个PRIMARY KEY索引,因此不需要指定索引名。如果没有创建PRIMARY KEY索引,但表具有一个或多个UNIQUE索引,则MySQL将删除第一个UNIQUE索引。

    如果从表中删除了某列,则索引会受到影响。对于多列组合的索引,如果删除其中的某列,则该列也会从索引中删除。如果删除组成索引的所有列,则整个索引将被删除。

    五、单一索引和复合索引

    1.单一索引:
    单一索引是指索引列为一列的情况,即新建索引的语句只实施在一列上;

    2.复合索引:
    复合索引也叫组合索引,用户可以在多个列上建立索引,这种索引叫做复合索引(组合索引)。

    复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;

    3.使用:

    创建复合索引 :
    CREATE INDEX columnId ON table1(col1,col2,col3) ;

    查询语句:
    select * from table1 where col1= A and col2= B and col3 = C
    这时候查询优化器,不在扫描表了,而是直接从索引中拿数据,因为索引中有这些数据,这叫覆盖式查询,这样的查询速度非常快;

    4.注意事项:

    (1)对于复合索引,在查询使用时,最好将条件顺序按找索引的顺序,这样效率最高;
    select * from table1 where col1=A AND col2=B AND col3=D
    如果使用
    where col2=B AND col1=A
    或者
    where col2=B
    将不会使用索引。

    (2)何时是用复合索引 根据where条件建索引是极其重要的一个原则; 注意不要过多用索引,否则对表更新的效率有很大的影响,因为在操作表的时候要化大量时间花在创建索引中

    (3)复合索引会替代单一索引么 如果索引满足窄索引的情况下可以建立复合索引,这样可以节约空间和时间

    (4)对一张表来说,如果有一个复合索引 on (col1,col2),就没有必要同时建立一个单索引 on col1;

    如果查询条件需要,可以在已有单索引 on col1的情况下,添加复合索引on (col1,col2),对于效率有一定的提高;

    同时建立多字段(包含5、6个字段)的复合索引没有特别多的好处,相对而言,建立多个窄字段(仅包含一个,或顶多2个字段)的索引可以达到更好的效率和灵活性。

    六、创建索引需要注意的问题

    1.创建索引
    对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加

    索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。
    但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

    2.复合索引
    比如有一条语句是这样的:select * from users where area=’beijing’ and age=22;

    如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效

    率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。
    因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

    3.使用短索引
    对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

    4.排序的索引问题
    mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

    5.不使用NOT IN和操作
    NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id

    七、索引失效的情况

    1.当语句中有or时:select * from user where name = ‘aaa’ or age = 18;
    2.当语句索引like带%时:select * from user where name like %’aaa’;
    3.如果列类型是字符串,一定要将数据用引号引起来:
    Select * from user where name = 123;
    4.在索引上进行操作时:比如age为索引,select * from user where age – 1 > 11;
    5.Mysql在使用全表扫描比使用索引扫描快时,则不会走索引
    6.只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
    7.条件中包含&lt、&gt(<>)

    八、索引的数据结构为什么是B+数而不是hashmap或者B树?

    1.B+树的磁盘读写代价更低
    B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,如果把所有同一内部节点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多,一次性读入内存的需要查找的关键字也就越多,相对IO读写次数就降低了。

    B+树的查询效率更加稳定
    由于非叶子节点只存索引信息,而没有真正的数据信息,所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。

    B+树更加适合在区间查询的情况
    由于B+树的数据都存储在叶子结点中,非叶子结点均为索引,只需要扫一遍叶子结点即可得到所有数据信息,但是B树因为其非叶子结点同样存储着数据,我们要找到具体的数据,需要进行一次中序遍历按序来扫,所以B树更加适合在区间查询的情况,通常B+树用于数据库索引。

    展开全文
  • 多个索引时,mysql索引的命中规则

    千次阅读 2019-06-10 11:56:28
    在解释索引命中规则的前提下, 先了解一下如下原则: 最左匹配原则: 最左前缀匹配原则, mysql会一只向右匹配直到遇到范围查询(>, <, between, like)就停止匹配, 比如a=1 and b=2 and c>3 and d=4 如果建立...
  • 经测试,在oracle数据库中是不支持对同一数据列建立两单列索引 例: 在table表的column列上建立索引索引1:create index inx_table_column on table(column); 创建索引成功 索引2:create index inx_table...
  • multi column的索引与isolate的column索引,到底孰优孰劣?结论如下: 对于具有2用and连接条件的语句,且2列之间的关联度较低的情况下,multi col index有一定优势。 对于具有2用and连接条件的语句,且2...
  • mysql的in查询是可以用到索引吗?亲测详解

    万次阅读 热门讨论 2019-04-09 17:41:19
    后来陆陆续续看到很博客,有的说in查询可以用索引,有的说不能用索引,所以博主就越发好奇起来。到底能不能用索引,绝对有正确的答案,而不是这样的模棱两可。 二、in查询的一些总结     &...
  • 为时间字段加索引

    千次阅读 2020-03-24 18:29:58
    文章目录为时间字段加索引(待更进)一、问题1、描述:日期不一致2、原因:时区不同3、解决方法: 时区修改二、datetime和varchar类型效率比较1、背景2、开始三、时间字段加索引1、聚集索引2、非聚集索引3、时间字段...
  • mysql in 索引失效的问题

    千次阅读 2019-08-28 20:27:40
    最终得知, MySQL当对一列进行操作时,如果in的条件太,即使这列上有索引,也是导致执行计划不走索引因为搜索的记录数太,MySQL会认为全表扫描可能会更快 可以看到 id为18和33的两数据占据大多数记录, 下面吧...
  • Python——获取列表中指定元素(多个)的索引 目标:获取列表中出现为word的所有索引,并作为列表输出。 解决方案:循环遍历+判断(简单) 写作目的:改写为函数形式,便于以后直接调用。 def get_same_...
  • 之所以还写这篇博文,是因为好多人还一直保留着一条sql语句只能使用一个索引的错误观念。本文会通过一些示例来说明如何使用索引合并。 什么是索引合并 下面我们看下mysql文档中对索引合并的说明: The Index ...
  • in 索引失效的问题

    千次阅读 2019-09-27 02:42:33
    先安利一篇博文MySQL的or/in/union与索引优化 简单的in查询 索引失效: 步骤 1、检查建立索引没有 order_status 字段为普通索引的tinyint类型 2、检查是否使用了使索引失效的语句 3、explain查看执行计划 ...
  • 大表数据加索引,字段

    千次阅读 2017-11-20 23:54:56
    这段时间发现一800W的用户表 查询非常慢,用了orderby ,排序的字段是string的,虽然也索引,但效果不理想。由于之前的经验,一张5000W的表,orderby 一timestamp 字段,只要了 tree 索引,分页10条的速度也...
  • SQL IN 一定走索引吗?

    千次阅读 2019-06-16 20:12:33
    IN 一定走索引吗?那当然了,不走索引还能全部扫描吗?好像之前有看到过什么Exist,IN走不走索引的讨论。但是好像看的太久了,又忘记了。哈哈,如果你也忘记了MySQL中IN是如何查询的,就来复习下吧。 问题 问题要从...
  • MySQL in不走索引

    千次阅读 2016-08-19 17:14:35
    优化前SELECT*  FROM erp_helei mg WHERE mg.num = 602 ... IN   (10002559,10002561,10002562,10002563,10002564,10002598,10002599,10002600,10002601,10002602,10002603,10002604,10002648,10002649,1000
  • ES学习之单个索引映射多个类型

    千次阅读 2018-06-19 13:31:00
    在6.0.0以下的版本中创建的一个索引映射多个类型的索引在6.0.0版本中继续发挥作用,但是将在7.0.0中完全删除。 自第一次发布弹出式搜索以来,每个文档都存储在一个索引中,并分配一个映射类型。映射类型用于表示被...
  • # 如果直接用X.index(1),只能得到0这一个索引,而我们需要所有索引. l = len(X) zip_list = zip(*(range(l),X)) id1 = [z[0] for i,z in enumerate(zip_list) if z[1]==1] # 或者更简单的 id1 = [i fo...
  •        有的时候会经常遇到条件过滤的场景...1、直接根据条件进行索引,isin()接受一列表,判断该列中元素是否在列表中 import numpy as np import pandas as pd df=pd.DataF...
  • 从wind上面搞到一批股票数据后发现:本来是一个类型的数据,但是由于季度不同,列名也不同,导致使用pandas合并多个报表的时候总是出现一大堆NaN,所以这里我写了一个函数,专门针对这样的表 它的思路是:生成一...
  • 获取列表中多个相同元素的索引

    千次阅读 2016-05-05 20:55:57
    >>> a = ['a','b','c','a','c'] >>> for item in enumerate(a): if item[1] == 'a': print item[0] 0 3 >>>
  • mysql关于in子查询索引

    千次阅读 2019-03-31 00:37:23
    今天和大家看下关于子查询索引的问题. 我本地是5.6版本 这是我的数据结构和表定义 CREATE TABLE test ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(191) COLLATE utf8mb4_unicode_ci NOT ...
  • 解决:曲线救国。如果大家有更好的方法欢迎指出。谢谢 list1 = [1,1,1,2,3,4,5,8,8] # 原始列表 ...list1 = [list1[i] for i in range(0, len(list1), 1) if i not in index_to_delete] # 删除后的列表 # ...
  • python 按照索引删除list中多个元素

    千次阅读 2019-10-23 17:18:05
    list=['r','l','e','w','t'] index = [0,1,3] #反向循环 for i in reversed(index): del list[i] print(list)
  • SOLR对多个(关联)表创建索引

    万次阅读 2016-09-30 16:56:29
    一、无关联表创建索引 1.1数据库准备  首先在数据库创建一张表,本来有一tuser表了,我又创建了一role表,就两三字段,没什么特殊的,然后在里面随便添加几条数据即可,看一下数据库: 1.2...
  • 表中有三字段,XX,YY,ZZ,如果要建立给这三字段建组合索引(Composite Index),组合索引中字段的顺序应该遵循怎样一原则。一般的原则:越离散的字段越靠前。哪个列可以降低索引的扫描成本就放在前面。比如...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 599,875
精华内容 239,950
关键字:

多个in加索引