哈啰出行作为阿里系共享单车的头部企业,在江湖中的知名度还是有的,而今天我们就来看一道哈啰Java一面中的经典面试题:当数据表中数据量过大时,应该如何优化查询速度?哈啰出行的面试题目如下:其他面试题相对来说比较简单,大部人题目都可以在我的网站上(www.javacn.site)找到答案,这里就不再赘述,咱们今天只聊“数据表中数据量过大时,应该如何优化查询速度?”这个问题。1、如何优化查询速度?所谓的“大表”指的是一张表中有大量的数据,而通常情况下数据量越多,那么也就意味着查询速度越慢。这是因为当数据量增多时,那么查询一个数据需要匹配和检索的内容也就越多,而检索的项目越多,那么查询速度也就越慢。举
一、讲故事你是否遇到过开发人员添加字段,导致数据库锁表问题?但是令开发疑惑的事,他们添加字段,有的时候很快,有的时候很慢?为什么呢?询问得知,**加的慢时候是带上了default默认值,如果表的数据量很大,那么会花费很长时间。在加字段期间,表上还会加6级锁,连select都会被阻塞。**这在生产系统是不可接受的。所以,任何DDL操作,都应该询问DBA是否有风险。从11g开始,这种情况有了明显的改善。Oracle11g引入了元数据唯一默认值的概念。如果增加的列符合default+notnull这两个条件的话,它只会去更新数据字典,不会去更新物理行,所以操作可以很短的时间完成,且不会对生产产生影响
我很好奇NoSQL解决方案如何支持在分布在多个服务器上的非常大的表中进行关键字搜索?我所说的关键字搜索是指像Google那样的数据库,拥有大量文档,并且能够非常快速地回答诸如找到“纽约的酒店”之类的问题。我在NoMysql解决方案中看到支持OR操作的非常简单的解决方案(例如,查询:“A或B或C”)——只是使用另一个非常大的分布式表,该表将保存从任何单词到它所在的文档。在这种情况下,给定“A或B或C”,我们可以直接转到索引表中的“A”或“B”或“C”条目并收集所有文档ID。然后,一旦我们有了id就可以自己获取文档。但是如何设计一个支持高效AND操作的数据库(例如,如果我需要搜索“Aand
我需要在PHP和Mysql中处理分页,问题陈述如下:我有一个表,其中包含2个外键关系的数十万条记录,例如“用户”和“项目”,并且该表经常更改,为特定用户添加或删除项目。现在我想向用户列出所有项目,并在标题中显示分页和总数。我的表是MyISAM并且也使用SQL_CALC_FOUND_ROWS。表结构如下,基数很大。CREATETABLE`USER_ITEMS`(`ID`int(11)NOTNULL,`ITEMS`int(11)unsignedNOTNULLDEFAULT'0',`USER`int(11)unsignedNOTNULLDEFAULT'0',`TYPE`char(1)NOTN
我有一个SQL查询,其中3个表连接在一个远程MySQL数据库上其中两个表的大小约为15GB(STEP_RESULT和meas_numericlimit)在发送数据之前,在服务器上创建一个TMP表,大约需要2.5小时才能结束我不是服务器管理员,但我可以使用MySqlWorkBench观察我的查询此服务器是最新的,具有64GB的RAM如何优化这个查询?谢谢我的查询:selectt1.UUT_NAME,t1.STATION_NUM,t1.START_DATE_TIME,t3.LOW_LIMIT,t3.DATA,t3.HIGH_LIMIT,t3.UNITS,t2b.STEP_NAMEfromm
我有一个MyISAM表(在Mariadb上),其中有700万行。CREATETABLE`mytable`(`id`bigint(100)unsignedNOTNULLAUTO_INCREMENT,`x`int(5)unsignedNOTNULLDEFAULT'0',`y`int(5)unsignedNOTNULLDEFAULT'0',`value`int(5)unsignedNOTNULLDEFAULT'0'PRIMARYKEY(`id`))ENGINE=MyISAMAUTO_INCREMENT=10152508DEFAULTCHARSET=utf8PAGE_CHECKSUM=1当我做
该表是使用nestedsetmodel组织的.当我插入一些东西时,我需要将所有具有左/右值>目标的东西移动到左边。UPDATEprojectsSETrgt=rgt+2WHERErgt>=@superRgt;此查询可能需要几秒钟才能完成,这是NotAcceptable。我的问题是;如何优化此查询?有没有可能..对表的物理布局进行规范化/碎片整理/重新排序?创建更好的索引?只是变得更聪明并避免问题?我们正在使用Innodb表,并且已经有左、右和左/右索引。该表有大约10万行。 最佳答案 没有Elixir,但有一些想法......我知道它
我正在使用mysql查询一个表,该表有1200万个寄存器,这些寄存器是上述数据的一年。查询必须选择某种数据(硬币、企业、类型等),然后为该数据的某些字段提供每日平均值,以便我们之后可以绘制图表。梦想能够实时执行此操作,因此响应时间少于10秒,但目前它看起来一点也不亮,因为它需要4到6分钟。例如,其中一个where查询产生了150k个寄存器,每天拆分大约500个,然后我们使用AVG()和GroupBy平均三个字段(不在where子句上)。现在,对于原始数据,查询是SELECT`Valorizacion`.`fecha`,AVG(tir)AS`tir`,AVG(tirBase)AS`tir
我有一个包含20多个表的MySQL数据库,但其中一个表非常大,因为它从不同的传感器收集测量数据。它的磁盘大小约为145GB,包含超过10亿条记录。所有这些数据也被复制到另一个MySQL服务器。我想将数据分成更小的“碎片”,所以我的问题是以下哪种解决方案更好。我会使用记录的“时间戳”来按年划分数据。几乎所有在此表上执行的SELECT查询都在查询的“where”部分包含“timestamp”字段。所以以下是我无法决定的解决方案:使用MySQL分区并按年份划分数据(例如分区1-2010,分区2-2011等)创建单独的表格并按年份划分数据(例如measuring_2010、measuring_
我有一个非常大的表(超过10M甚至100M条记录)具有此架构:idint主键,规则int并希望根据规则选择一个随机条目。我试过这个查询,但这需要很长时间(treenode是表的名称):SELECTtmp.id,tmp.ruleFROMtreenodeLEFTJOIN(SELECT*FROMtreenodeORDERBYRAND())tmpON(treenode.rule=tmp.rule)GROUPBYtmp.rule;将数据作为哈希表保存在内存中会占用大量内存。另一种选择是从数据库中获取每个组并选择一个随机条目。同样,由于组数约为100k,将这些数量的查询发送到数据库需要很长时间。更