精华内容
下载资源
问答
  • 如何查看mongodb的索引命中率

    千次阅读 2018-11-27 17:30:50
    如何查看mongodb的索引命中率 一、背景 现在mongodb使用率很高,经常会遇到查询慢时,就会创建索引,而有时候索引命中率又不高,下面来介绍下测试环境下如何查看索引命中率 二、方案 1、首先查看查询collection的...

    如何查看mongodb的索引命中率

    一、背景

    现在mongodb使用率很高,经常会遇到查询慢时,就会创建索引,而有时候索引命中率又不高,下面来介绍下测试环境下如何查看索引命中率

    二、方案

    1、首先查看查询collection的索引列表
    在这里插入图片描述

    2、将mongodb的监控打开db.setProfilelevel(2),监控所有查询,然后对查询条件进行分析。
    统计下数据库中针对某一个表的查询次数(query、mapreduce)
    在这里插入图片描述

    找一个查询条件进行执行计划分析
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    meter_ttl和timestamp_idx都是非最优索引,所以被拒绝。并且这两个索引重复了,
    统计出命中该索引的次数,以及针对该collection的总次数,这样就能计算命中率,当然这个只能针对特定功能使用的索引,如果是主键或唯一索引不需要参考这个

    展开全文
  • MYSQL索引命中率

    千次阅读 2019-04-07 14:45:29
    一、MySQL 索引类型 1、从物理存储角度上,索引可以分为聚集索引和非聚集索引。 ①.聚集索引(Clustered Index) 聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。 ②. 非聚集索引(Non-...

    一、MySQL 索引类型

       1、从物理存储角度上,索引可以分为聚集索引和非聚集索引。

    ①. 聚集索引(Clustered Index)

    聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。

    ②. 非聚集索引(Non-clustered Index)

    非聚集索引并不决定数据在磁盘上的物理排序,索引上只包含被建立索引的数据,以及一个行定位符 row-locator,这个行定位符,可以理解为一个聚集索引物理排序的指针,通过这个指针,可以找到行数据

    2、逻辑角度,索引可以分为以下几种。

    ①普通索引:最基本的索引,它没有任何限制。

    ②唯一索引:与普通索引类似,不同的就是索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

    ③主键索引:它是一种特殊的唯一索引,用于唯一标识数据表中的某一条记录,不允许有空值,一般用     primary key 来约束。主键和聚集索引的关系详见“问题详解”中的第4题。

    ④联合索引(又叫复合索引):多个字段上建立的索引,能够加速复合查询条件的检索。

    ⑤全文索引:老版本     MySQL 自带的全文索引只能用于数据库引擎为 MyISAM 的数据表,新版本 MySQL 5.6 的 InnoDB 支持全文索引。默认 MySQL 不支持中文全文检索,可以通过扩展 MySQL,添加中文全文检索或为中文内容表提供一个对应的英文索引表的方式来支持中文。

    二、索引优化规则

    1.前导模糊查询不能使用索引。

    2.union、in、or 都能够命中索引,建议使用 in。

    3.负向条件查询不能使用索引,可以优化为 in 查询。

    4.联合索引最左前缀原则(又叫最左侧查询)

    5.范围列可以用到索引(联合索引必须是最左前缀)。

    6.把计算放到业务层而不是数据库层。

    7.强制类型转换会全表扫描

    8.更新十分频繁、数据区分度不高的字段上不宜建立索引。

    9.利用覆盖索引来进行查询操作,避免回表。

    10.如果有 order by、group by 的场景,请注意利用索引的有序性。

    11.使用短索引(又叫前缀索引)来优化索引。

    12.建立索引的列,不允许为 null。

    13.利用延迟关联或者子查询优化超多分页场景。

    14.业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。

    15.超过三个表最好不要 join。

    16.如果明确知道只有一条结果返回,limit 1 能够提高效率。

    17.SQL 性能优化 explain 中的 type:至少要达到 range 级别,要求是 ref 级别,如果可以是 consts 最好。

    18.单表索引建议控制在5个以内。

    19.单索引字段数不允许超过5个。

     

    20.创建索引时避免以下错误观念

    • 索引越多越好,认为一个查询就需要建一个索引。

    • 宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度。

    • 抵制惟一索引,认为业务的惟一性一律需要在应用层通过“先查后插”方式解决。

    • 过早优化,在不了解系统的情况下就开始优化。

    展开全文
  • 结果发现,虽然我们创建了索引,但是 SQL 并没有命中索引,这是为什么? 联合索引 先说一下联合索引的概念,MySQL 中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,...

    原文链接:http://www.linkedkeeper.com/detail/blog.action?bid=6

    执行 MySQL DumpSlow 结果是:

    1
    Count:  1358   Time= 0 .33s (448s)  Lock= 0 .00s (0s)  Rows= 2.5  ( 3343 )

    Count:出现次数
    Time:执行最长时间(累计总耗费时间)
    Lock:等待锁的时间
    Rows:发送给客户端的行总数(扫描的行总数)

    其中:Count 会告诉我们这种类型的语句执行了几次,Time会告诉我们这种类型的语句执行的最大时间,Time=0.33s (448s) 中(448s)是指这类型的语句执行总共花费的时间。

    上述结果告诉我们执行了 1358 次,最大时间是 0.33s,总共花费时间 448s,Lock时间 0s,单次返回的结果数是 2.5 条记录,Rows=2.5 (3343) 中的 3343 是指在 Count: 1358 次数总共返回了 3343 条记录集,Rows=2.5 显示 3343 / Count: 1358。

    SQL 查询为什么慢?

    首先查看 table_name 的是否有索引:

    1
    show index from table_name
    TableNon_uniqueKey_nameSeq_in_indexColumn_nameCollation...
    table_name0table_index1cityA...
    table_name0table_index2nameA...
    table_name0table_index3sexA...

    用 explain 分析查询 SQL 调用,结果如下:

    1
    explain select * from table_name where name=  'zhangsr'  and city =  'beijing'
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable_nameALLNULLNULLNULLNULL123456Using where
              

    explain 列的解释:

    table:显示这一行的数据是关于哪张表的;
    type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 const、eq_reg、ref、range、indexhe 和 ALL;
    possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从 WHERE 语句中选择一个合适的语句;
    key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引;
    key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好;
    ref:显示索引的哪一列被使用了,如果可能的话,是一个常数;
    rows:MYSQL认为必须检查的用来返回请求数据的行数;
    Extra:关于MYSQL如何解析查询的额外信息。

    结果发现,虽然我们创建了索引,但是 SQL 并没有命中索引,这是为什么?

    联合索引

    先说一下联合索引的概念,MySQL 中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,其中各个元素均为数据表的一列。另外,单列索引可以看成联合索引元素数为 1 的特例。

    • 情况一:全列匹配

    1
    explain select * from table_name where city =  'beijing'  and name=  'zhangsr'  and sex= 'man'
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable_namerefcitycity59const,const,const1Using index

    很明显,当按照索引中所有列进行精确匹配时,索引可以被用到。这里有一点需要注意,理论上索引对顺序是敏感的,但是由于 MySQL 的查询优化器会自动调整 where 子句的条件顺序以使用适合的索引,例如我们将 where 中的条件顺序颠倒:

    1
    explain select * from table_name where name=  'zhangsr'  city =  'beijing'  and and sex= 'man'

    效果是一样的。

    情况二:最左前缀匹配

    1
    explain select * from table_name where city =  'beijing'
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable_namerefcitycity11const1Using index

    当查询条件精确匹配索引的左边连续一个或几个列时,索引可以被用到,但是只能用到一部分,即条件所组成的最左前缀。上面的查询从分析结果看用到了 table_index 索引,但是 key_len为11,说明只用到了索引的第一列前缀。

    情况三:查询条件用到了索引中列的精确匹配,但是中间某个条件未提供

    1
    explain select * from table_name where city =  'beijing'  and sex =  'man'

    此时索引使用情况和情况二相同,查询只用到了索引的第一列,而后面的 sex 虽然也在索引中,但是无法和左前缀连接,因此需要对结果进行扫描过滤 sex)。如果想让 sex 也使用索引而不是 where 过滤,可以增加一个辅助索引,此时上面的查询会使用这个索引。

    情况四:查询条件没有指定索引第一列

    1
    explain select * from table_name where sex =  'man'
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable_nameALLNULLNULLNULLNULL123456Using where

    由于不是最左前缀,索引这样的查询显然用不到索引。

    情况五:匹配某列的前缀字符串

    1
    explain select * from table_name where city =  'beijing'  and name like  'zhang%'
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable_namerangecitycity11NULL11Using index

    此时可以用到索引,但是如果通配符不是只出现在末尾,则无法使用索引。

    情况六:范围查询

    1
    explain select * from table_name where city in ( 'beijing' , 'shanghai' )  and sex =  'man'
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable_namerangecitycity11NULL201Using index

    范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引。同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引。

    情况七:查询条件中含有函数或表达式

    如果查询条件中含有函数或表达式,则 MySQL 不会为这列使用索引。

    1
    explain select * from table_name where city =  'beijing'  and left(name, 5 ) =  'zhang'
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable_nameALLNULLNULLNULLNULL11Using where

    索引的选择性(Selectivity)与前缀索引

    既然索引可以加快查询速度,那么是不是只要是查询语句需要,就建上索引? 答案是否定的。因为索引虽然加快了查询速度,但索引也是有代价的:索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担,另外,MySQL 在运行时也要消耗资源维护索引,因此索引并不是越多越好。一般两种情况下不建议建索引。

    第一种情况是表记录比较少,例如一两千条甚至只有几百条记录的表,没必要建索引,让查询做全表扫描就好了。

    另一种不建议建索引的情况是索引的选择性较低。

    所谓索引的选择性 Selectivity ,是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:

    1
    Index Selectivity = Cardinality / #T

    显然选择性的取值范围为 (0, 1],选择性越高的索引价值越大,这是由 B+Tree 的性质决定的。例如,上文用到的 table_name 表,如果 name 字段经常被单独查询,是否需要建索引,我们看一下它的选择性:

    1
    SELECT count(DISTINCT(name))/count(*) AS Selectivity FROM table_name
    Selectivity
    0.0000

    name 的选择性不足 0.0001,所以实在没有什么必要为其单独建索引。

    有一种与索引选择性有关的索引优化策略叫做前缀索引,就是用列的前缀代替整个列作为索引 key,当前缀长度合适时,可以做到既使得前缀索引的选择性接近全列索引,同时因为索引 key 变短而减少了索引文件的大小和维护开销。

    1
    SELECT count(DISTINCT(city))/count(*) AS Selectivity FROM table_name
    Selectivity
    0.1108
    1
    SELECT count(DISTINCT(city,name))/count(*) AS Selectivity FROM table_name
    Selectivity
    1.0000

    总结

    通过以上的分析,调整了联合索引的先后顺序,并根据索引选择性,重现创建了索引,数据库 load 降了下来。


    展开全文
  • mysql索引命中率

    2019-07-18 16:58:27
    首先明确:为什么要用联合索引? 对于查询语句“SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2”涉及到两列,这个时候...而不用两个单列索引,这是因为一条查询语句往往应为mysql优化器的关系只用一个索引,就算你...

    转于:https://blog.csdn.net/claram/article/details/77574600

    首先明确:为什么要用联合索引?

    对于查询语句“SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2”涉及到两列,这个时候我们一般采用一个联合索引(e1, e3);而不用两个单列索引,这是因为一条查询语句往往应为mysql优化器的关系只用一个索引,就算你有两个索引,他也只用一个;在只用一个的基础之上,联合索引是会比单列索引要快的;

    下面讲讲联合索引的使用规则和哪些情况会命中不了联合索引


    示例如下。首先创建表:
    CREATE TABLE E (e1 INT, e2 VARCHAR(9), e3 INT, PRIMARY KEY(e1, e3));
    这样就建立了一个联合索引:e1,e3

    测试数据

    INSERT INTO E
    (e1, e2, e3)
    VALUES(1, 'aa', 2);


    触发联合索引是有条件的:
    1、使用联合索引的全部索引键,可触发索引的使用。
    例如:SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2

    2、使用联合索引的前缀部分索引键,如“key_part_1 <op>常量”,可触发索引的使用。
    例如:SELECT E.* FROM E WHERE E.e1=1

    3、使用部分索引键,但不是联合索引的前缀部分,如“key_part_2 <op>常量”,不可触发索引的使用。
    例如:SELECT E.* FROM E WHERE E.e3=1

    4、使用联合索引的全部索引键,但索引键不是AND操作,不可触发索引的使用。
    例如:SELECT E.* FROM E WHERE E.e3=2 OR E.e1=1

     

    以上通过explain测试即可看出效果

    展开全文
  • Oracle 索引命中详解

    千次阅读 2019-06-21 16:27:51
    整理一下Oracle数据查询索引命中情况,仅供参考,有问题欢迎指出修正: 创建测试表: CREATE TABLE TEST_HZ ( A VARCHAR(20), B VARCHAR(20), C VARCHAR(20) ); 插入数据: 本人比较懒,然后就直接建序列插...
  • 索引命中情况、索引命中类型、命中率等相关的信息,通过这种方式 可以对sql语句进行调优,对关键查询的条件创建索引以及注意一下sql语句的用法 尽量不使用like,尽量避免在某一列上进行运算,不使用 in not in 使用exist...
  • 这包括有关锁,索引使用,缓冲区高速缓存命中率和真空统计信息的信息。 Ruby API使开发人员可以轻松地将该工具集成到例如自动监视任务中。 您可以查看此博客文章,以获得有关如何详细分步教程。 替代版本: 核心...
  • 这包括有关锁,索引使用,缓冲区高速缓存命中率和真空统计信息的信息。 NodeJS API使开发人员可以轻松地将该工具集成到例如自动监视任务中。 您可以查看此博客文章,以获得有关如何详细分步教程。 替代版本: ...
  • 这包括有关锁,索引使用,缓冲区高速缓存命中率和真空统计信息的信息。 Python API使开发人员可以轻松地将该工具集成到例如自动监视任务中。 您可以查看此博客文章,以获得有关如何详细分步教程。 替代版本: ...
  • 这包括有关锁,索引使用,缓冲区高速缓存命中率和真空统计信息的信息。 Ruby API使开发人员可以轻松地将该工具集成到例如自动监视任务中。 您可以查看此博客文章,以获得有关如何详细分步教程。 替代版本: 安装 ...
  • 这包括有关锁,索引使用,缓冲区高速缓存命中率和真空统计信息的信息。 Elixir API使开发人员可以轻松地将该工具集成到例如自动监视任务中。 您可以查看此博客文章,以获得有关如何详细分步教程。 该库是的可选...
  • MySql优化-索引命中

    千次阅读 2017-04-14 18:23:19
    有多少是命中索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下.  MySql中是通过 Explain 命令来分析低效SQL的执行计划。命令的使用很简单. 示例 ...
  • 多个索引时,mysql索引命中规则

    千次阅读 2019-06-10 11:56:28
    在解释索引命中规则的前提下, 先了解一下如下原则: 最左匹配原则: 最左前缀匹配原则, mysql会一只向右匹配直到遇到范围查询(>, <, between, like)就停止匹配, 比如a=1 and b=2 and c>3 and d=4 如果建立...
  • hit 命中率

    2017-11-29 15:33:49
    1 BUFFER命中率 也就是通常所说高速缓存的命中率,这个指标是指通过内存得到访问的数据和所有访问的数据之间的一个比例。 正常指标范围:  Buffer命中率正常的指标为:90%-100%,但在数据库繁忙运行期间...
  • db2 缓冲池命中率

    千次阅读 2013-09-12 21:06:33
    缓冲池命中率:表明数据库管理器不需要从磁盘装入页(即该页已经在缓冲池中)就能处理页请求的时间百分比。 公式如下: 1 - ( 缓冲池数据物理读取 + 缓冲池索引屋里读取 ) / ( 缓冲池数据逻辑读取 + 缓冲池索引逻辑...
  • Oracle索引命中与扫描规律总结

    千次阅读 2012-08-24 17:32:54
    索引扫描类型(该表取自网络文章): index unique scan(索引唯一扫描) 通过唯一索引查找一个数值经常返回单个ROWID。如果该唯一索引有多个列组成(即组合索引),则至少要有组合索引的引导列参与到该查询中,如...
  • 第一种: 在PL/SQL中,在Explain plan Window中... Object name(对象名称)列中显示了命中索引名,Cost(耗费)列显示了CPU的使用(%)。 第二种: 使用Explain plan for 命令: 1、执行 “explain plan for...
  •  Object name列中显示了命中索引名,Cost列显示了CPU的使用(%)。 第二种:  使用Explain plan for 命令。  1、执行 “explain plan for 要执行的Sql语句;” 2、执行 “select * from...
  • ORACLE内存命中率

    2011-08-10 20:53:14
    关于Oracle中各个命中率的计算以及相关的调优 1)Library Cache的命中率: .计算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins) SQL>SELECT SUM(pinhits)/sum
  • mysql Innodb缓存命中率

    万次阅读 2015-07-16 20:06:25
    最近看服务器log发现有不少数据库操作超时的情况,有时候处理一个sql操作需要一两秒的时间,这显然是不可接受的。...可以查看mysql innodb缓存的一些信息(mysql innodb缓存保存了数据库索引和一些表的数
  • 查询命中率的sql

    千次阅读 2015-01-11 10:01:21
    缓冲区命中率:缓冲区命中率表示在不需要进行磁盘访问的情况下在内存结构中找到常用数据块的频率select (1-(sum(decode(name, 'physical reads',value,0))/(sum(decode(name, 'db block gets',value,0)) +sum...
  • Oracle检查命中率的SQL

    2014-03-27 16:23:30
    Oracle检查命中率的SQL   在数据库启动2小时后,可以通过以下SQL来测试数据库性能    1. 缓冲区命中率:   www.2cto.com   缓冲区命中率表示在不需要进行磁盘访问的情况下在内存结构中找到...
  • hit 命中率的解释

    千次阅读 2014-03-26 15:15:17
    可以通过SQL查询得到Buffer NoWait命中率 select round((1 - busy.value/tol.value)*100,2) "Buffer busy NoWait Ratio" from (select sum(count) value from v$waitstat  where class in ('data block','segment ...
  • 如何提高服务器缓存命中率

    千次阅读 2014-01-19 23:03:45
    1.可以动态配置缓存时间,通过监控系统,通过不同的缓存时间,观察缓存命中率,如果缓存命中率达到了90%,则说明这个缓存时间设置合理, 2.通过使用多级hash缓存: 假如一个hash表数据存储在一个arr[size]数组中,...
  • SQL优化一键命中索引

    千次阅读 2018-09-21 15:47:14
    命中哪个索引?索引中有哪些是无效索引? 哪些会走索引,哪些必定不会走索引. Mysql中是通过explain神奇命令来分析低效sql的执行计划. 命令的使用很简单.(ps: 以下测试数据库为tc_test,放了53278条数据,主键为pripi...
  • Oracle中各个命中率的总结及调优

    千次阅读 2017-06-07 11:01:53
    Oracle中各个命中率的总结及调优 关于Oracle中各个命中率的计算以及相关的调优 1)Library Cache的命中率: .计算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins) SQL>SELECT SUM(pinhits)/sum...
  • Oracle 检查命中率的SQL

    2011-09-28 15:27:34
    在数据库启动2小时后,可以通过以下SQL来测试数据库性能 ...缓冲区命中率表示在不需要进行磁盘访问的情况下在内存结构中找到常用数据块的频率   select (1-(sum(decode(name, 'physical r

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,604
精华内容 14,641
关键字:

索引命中率