精华内容
下载资源
问答
  • 提高查询效率
    千次阅读
    2020-02-10 16:26:35

    问:使用视图能提高查询效率么?

    答:普通视图只是记录相当于把查询语句持久化了,下次再按照这个查询条件来查询一遍,只是添加了一个对多表关联更加方便的查询入口而已,并不能实际提高查询效率。通过物化视图可以达到提高查询效率的目的。

    【物化视图】(引用自百度百科):

    物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照) 。对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。(这个是基于本地的基表或者视图的聚合)。物化视图,说白了,就是物理表,只不过这张表通过oracle的内部机制可以定期更新,将一些大的耗时的表连接用物化视图实现,会提高查询的效率。当然要打开查询重写选项;

    更多相关内容
  • MySQL分区一定会提高查询效率

    千次阅读 2021-02-10 08:58:25
    对MySQL数据表分区一定会提高查询效率吗作为一个后端开发人员,我们一般都听说过对数据表进行分区的操作。甚至有开发人员说:这张表以后的数据量一定会很大,至少有好几千万条,我们对这张表分区吧。然而,有时候并...

    对MySQL数据表分区一定会提高查询效率吗

    作为一个后端开发人员,我们一般都听说过对数据表进行分区的操作。甚至有开发人员说:这张表以后的数据量一定会很大,至少有好几千万条,我们对这张表分区吧。

    然而,有时候并没有感受到查询速度的提升,反而感觉更加的慢了。原因就是不好的分区设计导致对磁盘的IO操作次数增加了。

    我们现在来做个测试,数据有1000W条,储存引擎用的是InnoDB。

    首先我们创建数据表:

    create table user (

    id int(11) not null auto_increment,

    key_id int(11) not null,

    primary key (id),

    key key_id (key_id)

    ) engine = innodb

    partition by hash (id)

    partitions 10;

    我们采取的分区类型是hash分区,因为这样可以让数据比较均匀的储存在不同的分区中(我们之后可以看看数据分布情况)。且以主键id为标准进行分区。

    partitions 10指的是对这张表分10个区。

    好的,创建完数据表之后,我们插入1000W条数据。我们采用存储过程来实现:

    delimiter $$

    create procedure myproc()

    begin

    declare num int;

    set num = 1;

    while num <= 10000000 do

    insert into user (key_id) values(num); set num = num + 1;

    end while;

    end

    $$

    1.png

    定义完了存储过程之后,我们调用它:

    call myproc()$$

    执行存储过程大概有15分钟,耐心等待。

    OK,接下来我们大致看看数据表中的数据:

    2.png

    我们来查看下总共有多少条记录在数据表里面:

    select count(*) from user$$

    3.png

    1000W条记录对吧,嗯,真刺激。

    接下来我们来看看数据在这10个分区的分布情况:

    select table_name, partition_name, table_rows

    from information_schema.partitions

    where table_schema=DATABASE() AND table_name='user'\G

    4.png

    5.png

    通过table_rows可以看出,记录比较均匀的分布在10个分区里面。和我们预期一致。

    OK,接下来我们就开始查询比较,看看分区是否真的有用。我们先对主键进行查询:

    EXPLAIN PARTITIONS SELECT * FROM user WHERE id = 1\G

    6.png

    可以看到,只查询了分区p1。因为一般B+树是2~3层,所以最多进行了2~3次IO操作。

    这样吧,假设1000W条数据的单表构成的B+树有3层,而100W条数据表构成的B+树只有2层,那么,确实可以减少一次IO操作。但是如果100W和1000W行的数据构成的B+树层次都是一样的,可能都是2层。那么上述按照主键id分区的索引并不会带来性能的提高。

    OK,分析到这里,我们再来看看可能让大家吃惊的一条查询:

    EXPLAIN PARTITIONS SELECT * FROM user WHERE key_id = 1\G

    7.png

    可以看到,这一条查询对所有的分区(共10个)都进行了查询。这意味着什么?对磁盘的IO操作次数大大提高了。假设100W条记录构成的B+树只有2层好吧,那么对这10个分区进行查询也至少需要执行20次IO操作。很显然,因为分区后,以key_id列索引作为查询条件时,查询效率大大降低。

    展开全文
  • Mybatis提高查询效率的方式

    万次阅读 2019-08-02 16:45:56
    第一次会执行sql语句查询数据库,然后保存到sqlsession缓存,第二次查询会先从缓存里查找,有的话直接返回不会执行sql. 但是如果两次sql中间增加一次commit操作(insert,delete,update),如: select * from table ...

    一 缓存机制:
    1 一级缓存:
    当mysql连续执行两次select * from table where id =1;第一次会执行sql语句查询数据库,然后保存到sqlsession缓存,第二次查询会先从缓存里查找,有的话直接返回不会执行sql.
    但是如果两次sql中间增加一次commit操作(insert,delete,update),如:
    select * from table where id =1
    update table set name = zjw where id =1;
    select * from table where id =1
    这个时候第一次查询依然会执行sql查询数据库,但是在执行完update后会清空sqlsession里的缓存,原因是避免脏读,
    所以第二次select在缓存里找不到数据,又会执行sql查询数据库。
    2 二级缓存:
    二级缓存是基于mapper文件的namaspace,对该mapper的所有sqlsession都共享一个二级缓存,如果两个mapper的namespace一致,则两个mapper的所有sqlsession共用一个二级缓存,
    步骤:

    • 在全局配置文件mybatis-configuration.xml加入
    • 其次在mapper文件开启缓存 type里面是缓存类。如果不写是默认的mabatis缓存类,自定义缓存类必须实现cache接口
    • 需要缓存的pojo实体类要实现serializable接口,因为在缓存中取出数据映射到pojo类需要反序列化。
    • 不同的两个sqlsession查询走二级缓存,但是如果其中有一个commit操作,为避免脏读二级缓存还是会被清空。
    • 在每个sql语句上使用useCache=true/false是否使用缓存,flushcache=true/false是否刷新缓存 ,在每次的commit后默认刷新缓存。

    二 懒加载
    Mybatis中resultmap可以实现高级映射,association一对一,Collection一对多具有延迟加载功能









    在collection或association中fetchtype=lazy,即为懒加载
    在查询主表时,不会把子集查出来,直到子集用到的情况才会查出子集。

    展开全文
  • ElasticSearch提高查询效率

    千次阅读 2021-01-01 16:09:07
    es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊? 这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的...

    目录

    1 问题分析:

    2 面试题回答:

    2.1 性能优化的杀手锏——filesystem cache

    2.2 数据预热

    2.3 冷热分离

    2.4 document 模型设计

    2.5 分页性能优化


    1 问题分析:

    es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

    这个问题是肯定要问的,说白了,就是看你有没有实际干过 es,因为啥?其实 es 性能并没有你想象中那么好的。很多时候数据量大了,特别是有几亿条数据的时候,可能你会懵逼的发现,跑个搜索怎么一下 5~10s,坑爹了。第一次搜索的时候,是 5~10s,后面反而就快了,可能就几百毫秒。

    你就很懵,每个用户第一次访问都会比较慢,比较卡么?所以你要是没玩儿过 es,或者就是自己玩玩儿 demo,被问到这个问题容易懵逼,显示出你对 es 确实玩儿的不怎么样?

    2 面试题回答:

    说实话,es 性能优化是没有什么银弹的,啥意思呢?就是不要期待着随手调一个参数,就可以万能的应对所有的性能慢的场景。也许有的场景是你换个参数,或者调整一下语法,就可以搞定,但是绝对不是所有场景都可以这样。

    2.1 性能优化的杀手锏——filesystem cache

    你往 es 里写的数据,实际上都写到磁盘文件里去了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到 filesystem cache 里面去。

    es-search-process

    es 的搜索引擎严重依赖于底层的 filesystem cache,你如果给 filesystem cache 更多的内存,尽量让内存可以容纳所有的 idx segment file 索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。

    性能差距究竟可以有多大?我们之前很多的测试和压测,如果走磁盘一般肯定上秒,搜索性能绝对是秒级别的,1秒、5秒、10秒。但如果是走 filesystem cache,是走纯内存的,那么一般来说性能比走磁盘要高一个数量级,基本上就是毫秒级的,从几毫秒到几百毫秒不等。

    这里有个真实的案例。某个公司 es 节点有 3 台机器,每台机器看起来内存很多,64G,总内存就是 64 * 3 = 192G。每台机器给 es jvm heap 是 32G,那么剩下来留给 filesystem cache 的就是每台机器才 32G,总共集群里给 filesystem cache 的就是 32 * 3 = 96G 内存。而此时,整个磁盘上索引数据文件,在 3 台机器上一共占用了 1T 的磁盘容量,es 数据量是 1T,那么每台机器的数据量是 300G。这样性能好吗? filesystem cache 的内存才 100G,十分之一的数据可以放内存,其他的都在磁盘,然后你执行搜索操作,大部分操作都是走磁盘,性能肯定差。

    归根结底,你要让 es 性能要好,最佳的情况下,就是你的机器的内存,至少可以容纳你的总数据量的一半。

    根据我们自己的生产环境实践经验,最佳的情况下,是仅仅在 es 中就存少量的数据,就是你要用来搜索的那些索引,如果内存留给 filesystem cache 的是 100G,那么你就将索引数据控制在 100G 以内,这样的话,你的数据几乎全部走内存来搜索,性能非常之高,一般可以在 1 秒以内。

    比如说你现在有一行数据。id,name,age .... 30 个字段。但是你现在搜索,只需要根据 id,name,age 三个字段来搜索。如果你傻乎乎往 es 里写入一行数据所有的字段,就会导致说 90% 的数据是不用来搜索的,结果硬是占据了 es 机器上的 filesystem cache 的空间,单条数据的数据量越大,就会导致 filesystem cahce 能缓存的数据就越少。其实,仅仅写入 es 中要用来检索的少数几个字段就可以了,比如说就写入 es id,name,age 三个字段,然后你可以把其他的字段数据存在 mysql/hbase 里,我们一般是建议用 es + hbase 这么一个架构。

    hbase 的特点是适用于海量数据的在线存储,就是对 hbase 可以写入海量数据,但是不要做复杂的搜索,做很简单的一些根据 id 或者范围进行查询的这么一个操作就可以了。从 es 中根据 name 和 age 去搜索,拿到的结果可能就 20 个 doc id,然后根据 doc id 到 hbase 里去查询每个 doc id 对应的完整的数据,给查出来,再返回给前端。

    写入 es 的数据最好小于等于,或者是略微大于 es 的 filesystem cache 的内存容量。然后你从 es 检索可能就花费 20ms,然后再根据 es 返回的 id 去 hbase 里查询,查 20 条数据,可能也就耗费个 30ms,可能你原来那么玩儿,1T 数据都放 es,会每次查询都是 5~10s,现在可能性能就会很高,每次查询就是 50ms。

    2.2 数据预热

    假如说,哪怕是你就按照上述的方案去做了,es 集群中每个机器写入的数据量还是超过了 filesystem cache 一倍,比如说你写入一台机器 60G 数据,结果 filesystem cache 就 30G,还是有 30G 数据留在了磁盘上。

    其实可以做数据预热

    举个例子,拿微博来说,你可以把一些大V,平时看的人很多的数据,你自己提前后台搞个系统,每隔一会儿,自己的后台系统去搜索一下热数据,刷到 filesystem cache 里去,后面用户实际上来看这个热数据的时候,他们就是直接从内存里搜索了,很快。

    或者是电商,你可以将平时查看最多的一些商品,比如说 iphone 8,热数据提前后台搞个程序,每隔 1 分钟自己主动访问一次,刷到 filesystem cache 里去。

    对于那些你觉得比较热的、经常会有人访问的数据,最好做一个专门的缓存预热子系统,就是对热数据每隔一段时间,就提前访问一下,让数据进入 filesystem cache 里面去。这样下次别人访问的时候,性能一定会好很多。

    2.3 冷热分离

    es 可以做类似于 mysql 的水平拆分,就是说将大量的访问很少、频率很低的数据,单独写一个索引,然后将访问很频繁的热数据单独写一个索引。最好是将冷数据写入一个索引中,然后热数据写入另外一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在 filesystem os cache 里,别让冷数据给冲刷掉

    你看,假设你有 6 台机器,2 个索引,一个放冷数据,一个放热数据,每个索引 3 个 shard。3 台机器放热数据 index,另外 3 台机器放冷数据 index。然后这样的话,你大量的时间是在访问热数据 index,热数据可能就占总数据量的 10%,此时数据量很少,几乎全都保留在 filesystem cache 里面了,就可以确保热数据的访问性能是很高的。但是对于冷数据而言,是在别的 index 里的,跟热数据 index 不在相同的机器上,大家互相之间都没什么联系了。如果有人访问冷数据,可能大量数据是在磁盘上的,此时性能差点,就 10% 的人去访问冷数据,90% 的人在访问热数据,也无所谓了。

    2.4 document 模型设计

    对于 MySQL,我们经常有一些复杂的关联查询。在 es 里该怎么玩儿,es 里面的复杂的关联查询尽量别用,一旦用了性能一般都不太好。

    最好是先在 Java 系统里就完成关联,将关联好的数据直接写入 es 中。搜索的时候,就不需要利用 es 的搜索语法来完成 join 之类的关联搜索了。

    document 模型设计是非常重要的,很多操作,不要在搜索的时候才想去执行各种复杂的乱七八糟的操作。es 能支持的操作就那么多,不要考虑用 es 做一些它不好操作的事情。如果真的有那种操作,尽量在 document 模型设计的时候,写入的时候就完成。另外对于一些太复杂的操作,比如 join/nested/parent-child 搜索都要尽量避免,性能都很差的。

    2.5 分页性能优化

    es 的分页是较坑的,为啥呢?举个例子吧,假如你每页是 10 条数据,你现在要查询第 100 页,实际上是会把每个 shard 上存储的前 1000 条数据都查到一个协调节点上,如果你有个 5 个 shard,那么就有 5000 条数据,接着协调节点对这 5000 条数据进行一些合并、处理,再获取到最终第 100 页的 10 条数据。

    分布式的,你要查第 100 页的 10 条数据,不可能说从 5 个 shard,每个 shard 就查 2 条数据,最后到协调节点合并成 10 条数据吧?必须得从每个 shard 都查 1000 条数据过来,然后根据你的需求进行排序、筛选等等操作,最后再次分页,拿到里面第 100 页的数据。你翻页的时候,翻的越深,每个 shard 返回的数据就越多,而且协调节点处理的时间越长,非常坑爹。所以用 es 做分页的时候,你会发现越翻到后面,就越是慢。

    我们之前也是遇到过这个问题,用 es 作分页,前几页就几十毫秒,翻到 10 页或者几十页的时候,基本上就要 5~10 秒才能查出来一页数据了。

    有什么解决方案吗?

    不允许深度分页(默认深度分页性能很差)

    跟产品经理说,你系统不允许翻那么深的页,默认翻的越深,性能就越差。

    类似于 app 里的推荐商品不断下拉出来一页一页

    类似于微博中,下拉刷微博,刷出来一页一页的,你可以用 scroll api,关于如何使用,自行上网搜索。

    scroll 会一次性给你生成所有数据的一个快照,然后每次滑动向后翻页就是通过游标 scroll_id 移动,获取下一页下一页这样子,性能会比上面说的那种分页性能要高很多很多,基本上都是毫秒级的。

    但是,唯一的一点就是,这个适合于那种类似微博下拉翻页的,不能随意跳到任何一页的场景。也就是说,你不能先进入第 10 页,然后去第 120 页,然后又回到第 58 页,不能随意乱跳页。所以现在很多产品,都是不允许你随意翻页的,app,也有一些网站,做的就是你只能往下拉,一页一页的翻。

    初始化时必须指定 scroll 参数,告诉 es 要保存此次搜索的上下文多长时间。你需要确保用户不会持续不断翻页翻几个小时,否则可能因为超时而失败。

    除了用 scroll api,你也可以用 search_after 来做search_after 的思想是使用前一页的结果来帮助检索下一页的数据,显然,这种方式也不允许你随意翻页,你只能一页页往后翻。初始化时,需要使用一个唯一值的字段作为 sort 字段。

    展开全文
  • 查询效率慢的原因: 1:没有加索引或者索引失效 where条件使用如下语句会索引失效:null、!=、<>、or连接、in(非要使用,可用关键字exist替代)和not in、'%abc%'; 使用参数:num=@num、表达式操作:...
  • 使用子查询提高查询效率

    千次阅读 2018-04-23 17:13:57
    解决方案:使用子查询提高查询效率   实例: SELECT BTS.EMS_NE_NAME AS DEVICE_NAME,'3G' AS DEVICE_CATEGORY ,'光缆' AS COMPARE_TYP,SEG_ROAD. OP_CABLE_SEG_NAME AS OBJ_NAME , --ROAD.OP_ROA...
  • 查询需要的字段值,不用 select * 正确使用索引,对常用的字段,如 where 或 order by 关键字后的字段加索引 正确使用查询语句,如尽量不要用like,in 等无法走索引的关键字 分页分库分表,如果数据量超级大...
  • MySQL的索引本质上是一种数据结构 让我们先来了解一下计算机的数据加载。 磁盘IO和预读: 先说一下磁盘IO,磁盘读取数据靠的是机械运动,每一次读取数据需要寻道、寻点、拷贝到内存三步操作。...
  • MySQL的索引是如何提高查询效率的?

    千次阅读 2019-04-14 16:05:41
    MySQL的索引是如何提高查询效率的?一.索引是什么?二.MySQL中存储索引用的是什么结构?三.为什么要用B+树? 一.索引是什么? 索引是数据库中用来提高查询效率的技术,类似于目录。如果不使用索引,数据会零散的保存...
  • ES 在数据量很大的情况下如何提高查询效率

    万次阅读 多人点赞 2019-06-05 20:43:06
    如果面试的时候碰到这样一个面试题:ES 在数据量很大的情况下(数十亿级别)如何提高查询效率? 这个问题说白了,就是看你有没有实际用过 ES,因为啥?其实 ES 性能并没有你想象中那么好的。 很多时候数据量大了,...
  • 从数据库设计方面考虑: 建立索引 分区(MysQL,比如按时间分区) 尽量使用固定长度的字段 限制字段长度 从数据库I/O方面: 增加缓冲区 如果涉及表的级联,不同的表存储在...如果反复使用的查询,使用preparedStament减少...
  • 1:创建分区 DROP TABLE IF EXISTS `test`; CREATE TABLE test ( id int(10) unsigned NOT NULL AUTO_INCREMENT, time datetime NOT NULL COMMENT '业务时间', PRIMARY KEY ( id , time ) ) ENGINE=InnoDB AUTO....
  • 下面是一个采用联接查询的SQL语句, select * from employss where first_name||''||last_name ='Beill Cliton';
  • 介绍了SQL Server数据库中查询优化机制与索引类型,详细分析旨在提高SQL查询效率的有效索引的建立规则,归纳总结出了提高SQL Server数据库查询效率的方法.
  • SQL Server查询性能分析与查询效率提高.pdf
  • 1. 数据库方面 1. 建立索引 2.分区(如MySQL,按时间分区) 3. 尽量使用固定长度字段和限制字段长度(如 varchar(10)) 优势:... 提高数据库处理速度; 3. 附带校验数据库是否合法功能 2. 在数据库 I/O方面;...
  • 1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引; 2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id ...
  • 1、对查询进行优化,避免全表扫描,首先应考虑在where及order by涉及的列上建立索引。2、避免在where子句对字段进行null值判断,否则会导致引擎放弃使用索引而进行全表扫描。3、应尽量避免在where子句中使用!=或者&...
  • 怎样提高数据库查询效率

    千次阅读 2019-05-13 09:50:03
    主要通过三种途径提高数据库查询效率:1.SQL的性能优化,2.数据库的性能优化,3.查询优化 1.SQL的性能优化 SQL语句是用户访问关系数据库中数据的唯一方法,通常在一个关系数据库上,服务器的SQL进程会使用该服务器...
  • 如果不使用索引,数据会零散的保存在磁盘块中,查询数据需要挨个遍历每一个磁盘块,直到找到数据为止,使用索引后会将磁盘块以树桩结构保存,查询数据时会大大降低磁盘块的访问数量,从而提高查询效率。如果表中的...
  • SQL优化(提高查询效率的方式)

    千次阅读 2020-06-14 11:02:34
    sql查询时,查询同样的数据,有的sql写出来查询效率快,有的慢,为什么呢?
  • 提高数据库查询效率

    2018-11-27 15:28:35
    提高数据库查询效率的一些小建议和方法,希望能够帮助到你
  • B-Tree作为索引(mysql在实现上实际是B+-Tree)能够提高查询效率主要有两点: 1、 B-Tree是 多路搜索树,查询B-Tree中任意一个节点,最多需要访问h个节点(h为树高),无疑比遍历全表找到所需数据效率要高...
  • ORACLE提高查询效率强制走索引

    千次阅读 2018-06-06 09:12:40
    select /*+index( b HR_EXAM_PAPER_PER_HIS_IDX)*/ ---括号内写的是表的索引名称 b.PKID, (CASE WHEN b.ANSWER = b.RIGHT_ANSWERS THEN 'Y' ELSE 'N' END) IF_RIGHT ...
  • 如何提高链表的查询效率

    千次阅读 2022-02-09 14:53:54
    使用跳表 1.链表的变形:跳表。 跳表是一种我们不常见的数据...通过这种方式,当我们在查询6的时候,我们先通过索引,定位6在5之后,再通过指针,指向原始链表,得到6。通过这种方式,查找到6需要5步,原始需要6步。
  • es 在数据量很大的情况下(数十亿级别)如何提高查询效率?二. 数据预热三. 冷热分离四. document 模型设计五. 分页性能优化 一. es 在数据量很大的情况下(数十亿级别)如何提高查询效率? es 性能并没有你想象中...
  • 利用索引提高查询效率

    千次阅读 2012-06-04 22:57:28
    如果查询结果仅为一行或很少几行时(高选择性high selectivity),利用索引进行查询会大大提高效率。相比之下,如果没有索引,查询则只能顺序扫描整个表。在OLTP环境下,事务处理在很大程度上依赖于索引。只有在表很...
  • 如何提高SQL查询效率

    2013-10-23 13:58:39
    如何提高SQL查询效率,写SQL注意的地方
  • 提高数据库查询效率的方法

    千次阅读 2019-09-27 14:44:28
    在千万级的数据库查询中,如何提高效率? 1)数据库设计方面 a. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 b. 应尽量避免在 where 子句中对字段进行 null...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 499,067
精华内容 199,626
关键字:

提高查询效率

友情链接: ckhysion__line.rar