导航:首页 > 网络数据 > 大数据量优化

大数据量优化

发布时间:2023-09-02 06:56:12

1. 如何优化大数据,大流量的网站

我的经验是,大量的相关文章+合理的站内链接+稳定的更新频率。

如何做好seo优化策略可参考如下方法搭罩:

在搜索引擎优化中,SEO策略影响到最终的优化效果。SEO策略不管对中小网站还是大型网站都是重要的,而对于大型网站,制定一个好的SEO策略尤为重要。

第一部分:关键词分析

关键词分析是所有SEO必须掌握的一门功课,大型网站虽然有海量的数据,但是每个页面都需要进行关键词分析,除了SEO之外,策划、编辑也需要具备一定的关键词分析能力。

关键词分析的基本原则:

1、调查用户的搜索习惯:这是一个重要的方面,只有了解用户的搜索习惯,才能把我用户的搜索需求,用户喜欢搜索什么?用什么搜索引擎?等等

2、关键词不能过于宽泛:关键词过于宽泛会导致竞争激烈,耗费大量时间却不一定得到想要的效果,并且可能降低了关键词的相关性。

3、关键词不能过冷:想想,没有用户搜索的关键词,还值得去优化吗?

4、关键词要与页面内容保持高度的相关性:这样既有利于优化又有利于用户。

关键词挑选的步骤:

1、确定核心关键词:我们应该考虑的是哪一个词或者两个词能够最准确的描述网页的内容?哪一个词用户搜索次数最多?

2、核心关键词定义上的扩展:例如核心关键词的别名、仅次于核心关键词的组合等、核心关键词的辅助等。

3、模拟用户思维设计关键词:把自己假想为用户,那么我会去搜索什么关键词呢?

4、研究竞争者的关键词:分析一下排名占有优势的竞争对手的网页,他们都使用了什么关键词?

第二部分:页面逆向优化

为什么要做逆向优化?因为在大型网站中,页面的优化价值一般不同于中小网站。考虑到各种综合因素(例如品牌、页面内容、用户体验等),大型网站的页面优化价值大多数呈现逆向顺序,即:最终页>专题页>栏目页>频道页>首页。

如何针对各页面进行关键词分配呢?通常情况是这样的:

1、最终页:针对长尾关键词;

2、专题页:针对热门关键词,例如"周杰伦";

3、栏目页:针对固定关键词,例如"音乐试听";

4、频道页:针对核心关键词,例如"音乐";

5、首页:不分配关键词,而是以品牌为主。

在进行关键词分配后,我们可以在最终页中添加匹配的内链作为辅助,这是大型网站内链的优势。

第三部分:前端搜索引擎友好,包括UI设计的搜索友好和前端代码的搜索友好两点

1、首先来看UI设计的搜索引擎友好:主要是做到导航清晰,以及flash和图片等的使用,一般来说,导航以及带有关键词的部分不适合使用flash及图片,因为大多数搜索引擎无法抓取flash及图片中的文字。

2、然后是前端代码的搜索引擎友好:

a、代码的简洁性:搜索引擎喜欢简洁的html代码,这样更有利于分析。

b、重要信息靠前:指带关键词的及经常更新的信息尽量选择出现在html的靠前位置。

c、过滤干扰信息:大型网站的页面一般比较复杂,各种广告、合作、交换内容以及其他没有相关性的信息比较多,我们应该选择使用js、iframe等搜索引擎无法识别的代码过滤掉这一部分信息。

d、代码的基础SEO:这是基础的SEO工作,避免html错误以及语义化标签。

第四部分:内部链接策略

为什么要强调内部链接策略?因为内链具有以下优势:

1、大型网站海量的数据使内链的优势远远大于外链。外链的数量可能几千几万几十万,但是大型网站拥有成百万上千万甚至上亿的海量网页内容,如果用这些海量的网页做内链的建设,优势是很明显的。

2、网站内的网页间导出链接是一件很容易的事知兆闹情。

3、提高搜索引擎对网站的爬行索引效率,增强收录,也有利于PR的传递。

4、集中主题,使该主题的关键词在搜索引擎中具有排名优势。

第五部分:外部链接策略

在强调大型网站的内链建猜搜设的同时也不能太忽视了外链的建设。外链的建设虽然没有中小网站那么重要,但是也具有很高的价值。通常可以通过交换链接、制造链接诱饵、投放带链接的软文等方法来建设外链。

1、来看交换链接应该要遵循哪些原则:

a、链接文字中包含关键词;b、尽量与相关性高的站点、频道交换链接;c、对方网站导出链接数量不能过多,过多的话没有太大的价值;d、避免与未被收录以及被搜索引擎惩罚的网站交换链接

2、制造链接诱饵:制造链接诱饵是一件省力的工作,这使得对方网站主动的为我们添加链接。制造链接诱饵的技巧很多,但是可以用两个字来概括:创意。

3、带链接的软文投放。指的是在商务推广或者为专门为了得到外链而进行的带链接的软文投放。

第六部分:网站地图策略

有很多大型网站不重视网站地图的建设,不少大型网站的网站地图只是敷衍了事,做一个摆设。其实网站对于大型网站是很重要的,大型网站海量的数据、复杂的网站导航结构、极快的更新频率使得搜索引擎并不能完全抓取所有的网页。这就是为什么有的大型网站拥有百万千万甚至上亿级的数据量,但是却只被搜索引擎收录了网站数据量的一半、三分之一甚至更少的一个重要原因。连收录都保证不了,怎么去做排名?

Html地图:

1、为搜索引擎建立一个良好的导航结构。

2、Html地图中可以分为横向和纵向导航,横向导航主要是频道、栏目、专题等链接,纵向导航主要是针对关键词。

3、每个页面都有指向网站地图的链接。

Xml网站地图:主要针对Google、yahoo、live等搜索引擎。因为大型网站数据量太大,单个的sitemap会导致sitemap.xml文件太大,超过搜索引擎的容忍度。所以我们要将sitemap.xml拆分为数个,每个拆分后的sitemap.xml则保持在搜索引擎建议的范围内。

第七部分:搜索引擎友好写作策略

搜索引擎友好写作是创造海量数据对取得好的搜索引擎排名的很关键的一部分。而SEO人员不可能针对每个网页都提出SEO建议或者方案,所以对写作人员的培训尤为重要。如果所有写作人员都按照搜索引擎友好的原则去写作,则产生的效果是很恐怖的。

1、对写作人员要进行反复培训:写作人员不是SEO,没有经验,不可能一遍就领悟SEO的写作技巧。所以要对写作人员进行反复的培训才能达到效果。

2、创造内容先思考用户会去搜索什么,针对用户的搜索需求而写作。

3、重视title、meta写作:例如Meta虽然在搜索引擎的权重已经很低,但是不好的meta写作例如堆积关键词、关键词与内容不相关等行为反而会产生负作用。而Title的权重较高,尽量在Title中融入关键词。

4、内容与关键词的融合:在内容中要适当的融入关键词,使关键词出现在适当的位置,并保持适当的关键词密度。

5、为关键词加入链接很重要:为相关关键词加入链接,或者为本网页出现的其他网页的关键词加入链接,可以很好的利用内链优势。

6、为关键词使用语义化标签:

第八部分:日志分析与数据挖掘

日志分析与数据挖掘常常被我们所忽视,其实不管是大型网站还是中小网站,都是一件很有意义的工作。只是大型网站的日志分析和数据挖掘工作难度要更高一些,因为数据量实在太大,所以我们要具备足够的耐心来做该项工作,并且要有的放矢。

1、网站日志分析:网站日志分析的的种类有很多,如访问来源、浏览器、客户端屏幕大小、入口、跳出率、PV等。跟SEO工作最相关的主要有以下三种:a、搜索引擎流量导入;b、搜索引擎关键词分析;c、用户搜索行为统计分析

2、热点数据挖掘:我们可以通过自身的网站日志分析以及一些外在的工具和SEO自己对热点的把握能力来进行热点数据的挖掘。热点数据的挖掘主要有以下手段:a、把握行业热点,可以由编辑与SEO共同完成;b、预测潜在热点,对信息的敏感度要求较高,能够预测潜在的热门信息。c、自己创造热点,如炒作等;d、为热点制作专题

第九部分:为关键词创作专题

除了最终页面,各种针对热门的关键词所制作的专题应该作为网站的第二大搜索引擎流量来源。我们在对热点数据进行挖掘后,就可以针对这些热门关键词制作专题了。制作的专题页的内容从何而来?我们一般通过程序实现对应关键词相关的信息进行筛选聚合,这样就使得内容与关键词高度匹配,为用户、为搜索引擎都提供了所需要的内容。

当然,仅仅建立一个专题而没有辅助手段是很难保证专题的搜索引擎排名的,我们可以通过文章内链、频道页推荐、或者最终页的专题推荐来获得链接达到效果。

1、为热点关键词制作专题

2、关键词相关信息的聚合

3、辅以文章内链导入链接

2. 如何优化操作大数据量数据库

下面以关系数据库系统Informix为例,介绍改善用户查询计划的方法。

1.合理使用索引

索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:

●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。

●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

2.避免或简化排序

应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

●索引中不包括一个或几个待排序的列;

●group by或order by子句中列的次序与索引的次序不一样;

●排序的列来自不同的表。

为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

3.消除对大型表行数据的顺序存取

在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查询10亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果两个表要做连接,就要在“学号”这个连接字段上建立索引。

还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序操作:

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

虽然在customer_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

SELECT * FROM orders WHERE customer_num=104 AND order_num>1001

UNION

SELECT * FROM orders WHERE order_num=1008

这样就能利用索引路径处理查询。

4.避免相关子查询

一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

5.避免困难的正规表达式

MATCHES和LIKE关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”

即使在zipcode字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为SELECT * FROM customer WHERE zipcode >“98000”,在执行查询时就会利用索引来查询,显然会大大提高速度。

另外,还要避免非开始的子串。例如语句:SELECT * FROM customer WHERE zipcode[2,3]>“80”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。

6.使用临时表加速查询

把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:

SELECT cust.name,rcvbles.balance,……other columns

FROM cust,rcvbles

WHERE cust.customer_id = rcvlbes.customer_id

AND rcvblls.balance>0

AND cust.postcode>“98000”

ORDER BY cust.name

如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:

SELECT cust.name,rcvbles.balance,……other columns

FROM cust,rcvbles

WHERE cust.customer_id = rcvlbes.customer_id

AND rcvblls.balance>0

ORDER BY cust.name

INTO TEMP cust_with_balance

然后以下面的方式在临时表中查询:

SELECT * FROM cust_with_balance

WHERE postcode>“98000”

临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘I/O,所以查询工作量可以得到大幅减少。

注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

7.用排序来取代非顺序存取

非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。SQL语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。

有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。

实例分析

下面我们举一个制造公司的例子来说明如何进行查询优化。制造公司数据库中包括3个表,模式如下所示:

1.part表

零件号?????零件描述????????其他列

(part_num)?(part_desc)??????(other column)

102,032???Seageat 30G disk?????……

500,049???Novel 10M network card??……

……

2.vendor表

厂商号??????厂商名??????其他列

(vendor _num)?(vendor_name) (other column)

910,257?????Seageat Corp???……

523,045?????IBM Corp?????……

……

3.parven表

零件号?????厂商号?????零件数量

(part_num)?(vendor_num)?(part_amount)

102,032????910,257????3,450,000

234,423????321,001????4,000,000

……

下面的查询将在这些表上定期运行,并产生关于所有零件数量的报表:

SELECT part_desc,vendor_name,part_amount

FROM part,vendor,parven

WHERE part.part_num=parven.part_num

AND parven.vendor_num = vendor.vendor_num

ORDER BY part.part_num

如果不建立索引,上述查询代码的开销将十分巨大。为此,我们在零件号和厂商号上建立索引。索引的建立避免了在嵌套中反复扫描。关于表与索引的统计信息如下:

表?????行尺寸???行数量?????每页行数量???数据页数量

(table)?(row size)?(Row count)?(Rows/Pages)?(Data Pages)

part????150?????10,000????25???????400

Vendor???150?????1,000???? 25???????40

Parven???13????? 15,000????300?????? 50

索引?????键尺寸???每页键数量???页面数量

(Indexes)?(Key Size)?(Keys/Page)???(Leaf Pages)

part?????4??????500???????20

Vendor????4??????500???????2

Parven????8??????250???????60

看起来是个相对简单的3表连接,但是其查询开销是很大的。通过查看系统表可以看到,在part_num上和vendor_num上有簇索引,因此索引是按照物理顺序存放的。parven表没有特定的存放次序。这些表的大小说明从缓冲页中非顺序存取的成功率很小。此语句的优化查询规划是:首先从part中顺序读取400页,然后再对parven表非顺序存取1万次,每次2页(一个索引页、一个数据页),总计2万个磁盘页,最后对vendor表非顺序存取1.5万次,合3万个磁盘页。可以看出在这个索引好的连接上花费的磁盘存取为5.04万次。

3. Oracle数据库大数据量表如何优化

要看数据多到何种程度。
比如一个表的笔数只是几百,如果不需要和其他大表关联查询数据,连索引都不用建。
如果是几十万级别的表,一般正确建索引就可以。
如果是千万级别的表,不但要正确建索引,而且要定时手工进行收集统计信息维护,不建议系统自动维护,以免影响使用性能。
如果是亿以上级别的表,则可考虑按一定条件拆分表资拆好租料,将旧资料归档,这样可改旅兆善生成表的使用。
数据库优化的同时,程序也要袜盯进行相应优化,程序和
数据科学
搭配,才能使性能达到最佳。

4. PHP-大数据量怎么处理优化

大数据的话可以进行以下操作:

  1. 减少对数据库的读取,也就是减少调用数据库,

  2. 进行数据缓存,

  3. 利用数据库的自身优化技术,如索引等

  4. 精确查询条件,有利于提高查找速度

5. Oracle等数据库数据量特别大的时候怎样从程序和SQL语句方面优化使查询速度加快

一般最抄常用的大数据量优袭化:
1、创建分区表,使查询时的大表尽量分割成小表。Oracle提供范围分区、列表分区、Hash分区以及复合分区,具体选择哪种分区最优,需要根据你的业务数据来确定。
2、创建索引,创建合适的索引可以大大提高查询速度。但是你的这张大表如果会频繁的进行update、insert等操作,索引会导致这些操作变慢。就有可能需要进行动态索引的使用。
3、优化复杂SQL;对复杂的SQL进行合理的优化,这个有时候也需要根据你的数据情况来优化,可以参考一些SQL语句优化方面的文档。

6. 大数据量实时统计排序分页查询 优化总结

大数据量实时统计排序分页查询 (并发数较小时) 的瓶颈不是函数(count,sum等)执行,

不是having, 也不是order by,甚至不是表join, 导致慢的原因就在于“数据量太大本身”

就是将表划分为M份相互独立的部分,可以是分表,也可以是不分表但冗余一个取模结果字段

实际结果是不分表比分表更加灵活,只需稍加配置,就可以动态切分大表,随意更改M的大小。

将1条慢sql(大于30秒)拆分成为N条查询速度巨快的sql(单条sql执行时间控制在20毫秒以内)

然后再web应用中以适当的线程数去并发查询这些执行时间快的N条小sql再汇总结果

第一步查询中去并发执行这N条小sql, 只取排序字段和标识字段,其他字段一律丢弃

汇总结果后定位出当前页面要显示的pageNum条数据,再进行第二步查询,取出页面上需要展示的所有字段

PS:这一点是至关重要的,其他几点都可以不看,这点是最关键的。慢慢解释一下:

a) 第一种方式是把数据库中所有记录(只取排序字段和标识字段并且不做任何sum,count having order by等操作)

全部拉到web应用中,在web应用中完成所有的计算

b) 第二种方式是把数据库中所有记录做sum count having等操作之后的所有行数拉到web应用中,在web应用中完成剩余计算

c) 第三种方式是把数据库中所有记录做sum count having order by等操作之后把limit后的数据拉到web应用中,

在web应用中对limit后的数据再计算

显然,第一种方式 数据库什么活都不做只取数据 是不可行的。以lg_order_count_seller为例,1500万行,

如果只算id, seller_id和order_count 这三个bigint类型,至少需要拉8*3*1500 0000 = 360000000=340M,

拉到内存中之后存储需要8*4*15000000= 460M,这还不算List是的2的n次方这个特点和计算排序等的内存开销,

不仅数据库与web应用机器IO扛不住,就是应用自身恐怕也要OOM了。

第二种方式,所有记录做sum count having等操作之后,由于是group by seller_id的,总得数据量变为100万(就是卖家总数),

这样子一来,共需要拉8*3*100 0000 = 23M,拉到内存之后,需要8*4*100 0000 = 30M, 再算上List是的2的n次方这个特点和

计算排序等的内存开销也不会超过100M, IO的时间和内存开销勉强可以考虑接受。

第三种方式,所有记录做sum count having order by等操作之后把limit后的数据拉到web应用中,因为做了limit,所以,

数据量很小了,无论是IO还是内存开销都已经很小了。可以忽略。

综合以上三种,第三种方式适用于页面的前n页和后n页,因为这个limit的数据量随着页数的增大而增大,

当大到每个切分后的小表的数据量时就转为第二种方式了。

第二种方式适用于页面的第[n+1, totaoPageNum-n]页。

切分成N条小sql后并行执行时排序不稳定性的解决办法

① 问题描述:

优化之前,还是是一条大慢sql查询时,由于数据库排序是稳定排序,

所以当两条记录排序字段值相同时他们在页面上的页码位置是固定的。

优化之后,当并行执行这N条小sql时,由于无法控制这些小sql的先后执行顺序,

导致在web应用中当两条记录的排序字段值相同时在页面上的页码位置是随机的。

② 解决办法:

除了拉标识字段(seller_id)和排序字段(order_count_sum)之外,再取一个unique(id)的字段,当两条记录的排序字段值相同时,再用这个unique的字段(在卖家监控中这个字段是id)进行第二次排序.这样就解决了排序不稳定的问题。

③ 也许,看到这里会有疑问,为什么不用seller_id?seller_id也是唯一, 这样子不是少取id这个字段,减少IO了?

seller_id虽然也是唯一,可以辅助排序,但是不要忘记数据库的排序规则是:

如果两列的值相等,那么序号在前的排在前面,这里的序号就是主键(自动生成,autoincrement),

如果用seller_id的话还是不能保证排序的稳定性,只能用主键id.

优先加载页面上的主要元素,然后再去异步加载次要元素,

反应在卖家监控页面中,查数据和查页页码的sql语句基本相同,是在竞争同一资源,

所以,需要做一个策略,优先把资源让给查数,数据查完之后再去查页码。

限流

由于多线程取数据并没有从本质上提高数据库性能,所以必须针对大数据量实时统计排序分页查询做限流

我这里打个比方:食堂有6个窗口,物流团队吃饭要买6个菜,平均每买1个菜需要1分钟的时间,

如果派我一个人去一个窗口买的话需要6分钟的时间

假如派6个人分别去6个窗口买这6个菜,只需要1分钟的时间

但是,如果除了物流团队,再来其他5个团队呢,也就是说6个团队每个团队买6个菜共买36个菜,

这样子有的团队先买完,有的团队后买完,但平均时间还是6分钟。本质上没有变化。

所以,对于特定的查询条件,必须进行限流。让每分钟至多有6个团队买菜,这样子能使得情况变得不至于太糟糕。

从根本上改变现状

这一点从目前来看只能是展望了,比如mysql数据库换更为强大的oracle数据库,

或更换InnoDb引擎为其他,或更换SATA硬盘为SSD 。。。。。。

从实践效果来看,优化后的效果是很明显的。

相同的查询条件,原来一个页面查询时间由于超过60秒超时了,根据1-6点建议优化之后,查询时间变为2秒至3.5秒之间。

7. ES大数据量下的查询优化

filesystem类似于我们在mysql上建立一层redis缓存;

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

两者差距非常大,走磁盘和走systenfile cache的读取的性能差距可以说是秒级和毫秒级的差距了;

要让es性能要好,最佳的情况下,就是我们的机器的内存,至少可以容纳你的数据量的一半

最佳的情况下,是仅仅在es中就存少量的数据,存储要用来搜索的那些索引,内存留给filesystem cache的,如果就100G,那么你就控制数据量在100gb以内,相当于是,你的数据几乎全部走内存来搜索,性能非常之高,一般可以在1秒以内

的少数几个字段就可以了,比如说,就写入es id name age三个字段就可以了,然后你可以把其他的字段数据存在mysql里面,我们一般是建议用 es + hbase 的一个架构。
hbase的特点是适用于海量数据的在线存储,就是对hbase可以写入海量数据,不要做复杂的搜索,就是做很简单的一些根据id或者范围进行查询的这么一个操作就可以了

如果确实内存不足,但是我们又存储了比较多的数据,比如只有30g给systemfile cache,但是存储了60g数据情况,这种情况可以做数据预热;

我们可以将一些高频访问的热点数据(比如微博知乎的热榜榜单数据,电商的热门商品(旗舰版手机,榜单商品信息)等等)提前预热,定期访问刷到我们es里;(比如定期访问一下当季苹果旗舰手机关键词,比如现在的iphone12)

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

我们可以将冷数据写入一个索引中,然后热数据写入另外一个索引中,这样可以确保热数据在被预热之后,尽量都让他们留在filesystem os cache里,别让冷数据给冲刷掉。

尽量做到设计document的时候就把需要数据结构都做好,这样搜索的数据写入的时候就完成。对于一些太复杂的操作,比如join,nested,parent-child搜索都要尽量避免,性能都很差的。

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秒才能查出来一页数据了

你系统不允许他翻那么深的页,或者产品同意翻的越深,性能就越差

如果是类似于微博中,下拉刷微博,刷出来一页一页的,可以用scroll api
scroll api1 scroll api2
scroll会一次性给你生成所有数据的一个快照,然后每次翻页就是通过游标移动 ,获取下一页下一页这样子,性能会比上面说的那种分页性能也高很多很多

scroll的原理实际上是保留一个数据快照,然后在一定时间内,你如果不断的滑动往后翻页的时候,类似于你现在在浏览微博,不断往下刷新翻页。那么就用scroll不断通过游标获取下一页数据,这个性能是很高的,比es实际翻页要好的多的多。

缺点:

8. MySQL大数据量分页查询方法及其优化

使用子查询优化大数据量分页查询

这种方式的做法是先定位偏移位置的id,然后再往后查询,适用于id递增的情况。

使用id限定优化大数据量分页查询
使用这种方式需要先假设数据表的id是连续递增的,我们根据查询的页数和查询的记录数可以算出查询的id的范围,可以使用 id between and 来查询:

当然了,也可以使用in的方式来进行查询,这种方式经常用在多表关联的情况下,使用其他表查询的id集合来进行查询:

但是使用这种in查询方式的时候要注意的是,某些MySQL版本并不支持在in子句中使用limit子句。

参考 sql优化之大数据量分页查询(mysql) - yanggb - 博客园 (cnblogs.com)

阅读全文

与大数据量优化相关的资料

热点内容
如何指导小学生参加编程比赛 浏览:275
物业的招标文件有哪些 浏览:452
保存游戏文件名非法或只读 浏览:258
js怎么做图片时钟 浏览:451
华为应用里面有了app说明什么 浏览:801
数据库中xy是什么意思 浏览:893
u盘打不开提示找不到应用程序 浏览:609
网站功能介绍怎么写 浏览:954
word在试图打开文件时错误 浏览:108
主板无vga插槽怎么连接编程器 浏览:521
录视频文件在哪里删除 浏览:881
word2013如何插入文件 浏览:233
proe教程百度网盘 浏览:197
如何控制远程linux服务器 浏览:740
it教学app有哪些 浏览:34
怎么在ps抠的图变成矢量文件 浏览:405
口袋妖怪银魂安卓v11 浏览:1
网站上芒果tv的账号都是什么 浏览:104
带公式的表格如何刷新数据 浏览:81
数据标注语音和2d哪个好 浏览:145

友情链接