标签: database-performance

MySQL - 如何有效地获取ID最低的行?

是否有更快的方法来更新匹配特定条件的MySQL表的最旧行,而不是使用ORDER BY id LIMIT 1以下查询中的情况?

UPDATE mytable SET field1 = '1' WHERE field1 = 0 ORDER BY id LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

注意:

  • 假设主键是,id并且还有一个索引field1.
  • 我们正在更新一行.
  • 我们没有严格更新最旧的行,我们正在更新与条件匹配的最旧行.
  • 我们想要更新最旧的匹配行,即最低的id,即FIFO队列的头部.

问题:

  • ORDER BY id必要吗?MySQL如何默认订购?

现实世界的例子

我们有一个DB表用于电子邮件队列.当我们要将电子邮件排队以发送给我们的用户时,会添加行.行由cron作业删除,每分钟运行一次,在该分钟内尽可能多地处理并每行发送1封电子邮件.

我们计划放弃这种方法,并使用GearmanResque之类的东西来处理我们的电子邮件队列.但与此同时,我有一个问题,我们如何有效地标记队列中最旧的项目进行处理,即具有最低ID的行.此查询完成工作:

mysql_query("UPDATE email_queue SET processingID = '1' WHERE processingID = 0 ORDER BY id LIMIT 1");
Run Code Online (Sandbox Code Playgroud)

但是,由于扩展问题,它出现在mysql慢日志中很多.当表有500,000行时,查询可能需要10秒以上.问题是这个表自首次引入以来已经大量增长,现在有时有50万行,开销为133.9 MiB.例如,我们每天INSERT 6000个新行可能180次,并且删除大致相同的数字.

为了阻止查询出现在慢速日志中,我们删除了ORDER BY id以阻止整个表格的大规模.即

mysql_query("UPDATE email_queue SET processingID = …
Run Code Online (Sandbox Code Playgroud)

mysql message-queue database-performance

5
推荐指数
1
解决办法
1184
查看次数

mysql调整变量 - 当前和默认值

我有一个漂亮的vanilla mysql 5.1设置,我正在尝试调整它.我找到了这个方便的脚本

它提出了以下建议:

query_cache_limit (> 1M, or use smaller result sets)
query_cache_size (> 16M)
join_buffer_size (> 128.0K, or always use indexes with joins)
table_cache (> 64)
innodb_buffer_pool_size (>= 14G)
Run Code Online (Sandbox Code Playgroud)

在阅读这些意味着什么以及它们目前设定的内容时,我发现我可以运行"mysqladmin变量"

我目前的价值是:

query_cache_limit                       | 1048576  
query_cache_size                        | 16777216   
join_buffer_size                        | 131072     
innodb_buffer_pool_size                 | 8388608  
Run Code Online (Sandbox Code Playgroud)

我怎么读这些,是Kbytes吗?1M,16M,13M和8M也是如此?

我的盒子里只有4G的拉姆,平时只有几百米没有记忆.我应该遵循这些建议并做:

#innodb_buffer_pool_size = 15G
#table_cache = 128
#join_buffer_size = 32M
#query_cache_size = 64M
#query_cache_limit = 2M
Run Code Online (Sandbox Code Playgroud)

我迷惑了15G,这是一个磁盘空间的东西,不是记忆的东西?如果是的话那么建议不是很好吗?

我应该为我的盒子获得更多内存吗?

更多信息: - 我的数据库大小是34Gigs,我使用所有innodb,我有71个表,其中4个是巨大的,其余的都很小.我一直在考虑将大的那些移动到SOLR并从那里做所有的查询,但是想看看我能用基本的调整做些什么.

谢谢乔尔

mysql performance database-performance

5
推荐指数
1
解决办法
2371
查看次数

Sql Server TOP - 用过吗?

SQL Server中是否有关键字或元信息会告诉您TOP是否生效?

EX:
Select TOP 5 * From Stuff

RESULT: 5 rows
Run Code Online (Sandbox Code Playgroud)

确定是否有6个或更多的最佳方法是什么?

I could do:
SELECT TOP 6 count(*) FROM Stuff
Run Code Online (Sandbox Code Playgroud)

但我担心单独调用检索计数,因为实际查询比这个和大型表复杂得多.

谢谢!

sql sql-server database-performance

5
推荐指数
2
解决办法
163
查看次数

如何在数据库中管理国家

我知道我的问题有点模糊,但是我觉得管理国家/地区的地址实际上很普遍,因此我想从我的实际设置中获取一些建议。

I have a database with a "country" column, previously it was a medium int type, acting as Foreign Key to another table with the actual information about the countries (id, name and ISO3166-1 alpha2 code mainly).

After some testing and benchmarking I ended up having all the countries information in a php file array instead, including/requiring it when needed, and it was like one or two orders of magnitude faster than querying the database. (they are 278 countries).

So …

php mysql database-design countries database-performance

5
推荐指数
1
解决办法
728
查看次数

RDBMS对Golang的影响

在这个问题上,我不打算对我测试过的数字以及数字运算进行大肆宣传.我对实际的最新练习表演更感兴趣.

我已经阅读了大量文章,其中一些文章对一个图书馆非常持怀疑态度.我目前正在测试一下gorp,但我不知道如何比较这样一个库对其他人的表现.

我知道gorp是一个额外的层,它试图将ORM添加到基本的SQL驱动程序/实现中,但是看到Go非常清晰的代码,并且在它所做的每件事情上都非常接近骨架.这与我使用的PHP/Python/JAVA不同,你必须在无尽的复杂层面进行导航,以实际看到包的本质.

所以我的问题是,如果有人可以分享(基准总是欢迎:))他们在这个主题上的经验和知识.

我不认为NoSQL类型的解决方案是我的项目的选项.我的所有项目总是强烈依赖于业务逻辑和相互交织的关系.我也想知道Postgres是否会赢得MySQL.使用Django(Python),我注意到使用Postgres获得了显着的性能提升,但是如果它是由于Postgres核心实现或仅仅是Django使用包装器的方式,我从未找到证明.

小更新

在重读了这个问题后,我注意到我有点错过了它的实际目标.我实际上正在寻找最合适的SQL解决方案,这将最不会降低Golang本身的速度.我知道SQL运行并发,但在将其作为Web服务运行时也会遇到大量流量.如果能够让我获得性能上的重大收益,我将不会再次放弃ORM部分.

sql rdbms go database-performance

5
推荐指数
1
解决办法
2017
查看次数

SQL Server是否缓存视图的执行计划?

在SQL Server中,缓存存储过程执行计划,但从不缓存视图执行计划.真的吗?如果是,为什么SQL Server不缓存视图执行计划?

如果优化器花费很长时间来创建执行计划,那么将查询包装在视图中是否有帮助?

sql-server view database-performance

5
推荐指数
2
解决办法
3301
查看次数

Grails vs Spring

任何人都可以解释一下,对于超过500个数据库表的企业java Web应用程序来说,更好的选择.我们应该使用Grails或Go for(Spring,hibernate和Spring MVC/Struts 2).如果你建议grails那么请详细阐述为什么不是另一个,如果春天,那么为什么不grails.

谢谢.

java grails spring database-performance

5
推荐指数
1
解决办法
1万
查看次数

选择优化方式通过实体框架删除oracle中的行

我有一个场景,我必须定期删除几十万行(基于服务器决定或一些固定的时间间隔).我正在使用entityframework 6.0并且问题是正常的Remove()方法对于批量操作来说很慢.我在考虑一些可能的情况:

案例1:通过实体框架,使用RemoveRange.

var db = new MyDbContext();
var itemsToDelete = db.TableFoo.Where(x=>!x.new);
db.MyTable.RemoveRange(itemsToDelete);
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我检查过这个比在foreach中单独使用Remove更快.但它仍然发送oracle原子sql而不是批处理.

情况2:通过实体框架调用一些过程或包,它们将对表执行删除操作.虽然在我看来它是最快的选择,但我仍然需要在这里弄清楚什么是最好的删除方式,我知道截断,但它不会在这里起作用.我所知道的是:

CREATE OR REPLACE PROCEDURE deleteDBFoo(p_toc IN DBFOO.TOC%TYPE)
IS
BEGIN

  DELETE DBFOO where TOC < "SOME DATE";

  COMMIT;

END;
Run Code Online (Sandbox Code Playgroud)

案例3:在oracle中自动执行此任务(不知道这是否可能),大小写标准是从某个修复日期 - 时间间隔中删除所有旧行.

处理此方案的优化方法是什么?如果除了这些案例之外还有其他一些更好的方法,请对此有所了解.

UPDATE1:做了一些分析后,我发现了以下结果:

用于删除数据库中的100万行

Trunc Table耗时3.46秒.案例2:花了37.398秒案例1:花了几分钟.对于我的解决方案,我将使用案例2,但我仍然比案例2更好地等待解决方案或以某种方式改进它.

c# sql oracle entity-framework database-performance

5
推荐指数
1
解决办法
354
查看次数

放置完整性约束会降低性能吗?

在与朋友的讨论中,我听到了两件事 -

  1. 使用约束会导致性能略有下降.例如.考虑唯一性约束.在插入之前,DBMS必须检查所有现有数据的唯一性,从而导致额外的计算.

  2. 他建议确保在应用程序级逻辑本身处理这些约束.例如.正确地从两个表中删除行,而不是放置外部完整性约束等.

第一个对我来说听起来有点合乎逻辑,但第二个看起来很直观.我没有足够的DBMS经验来真正判断这些说法.

问:索赔1是否正确?如果是这样,即使是处理此类情况的正确方法,索赔2也是如此?

database database-design referential-integrity database-performance

5
推荐指数
1
解决办法
2088
查看次数

使用PHP和MySQL ...我如何释放内存?

需求:

我们在两台服务器上有两个相似的表.服务器中的第一个表具有唯一的键列A,B,C,并且我们将Table1行插入到具有唯一键列B,C,D的Table2中.

表1具有大约5百万行,并且由于不同的唯一键列约束,表2将插入大约3百万行.

这里的要求是从Table1获取所有行,如果Table2中没有相同的记录,则插入Table2,如果记录匹配,则增加计数并更新Table2中的'cron_modified_date'列.

对于此设置,PHP版本为5.5,MySQL版本为5.7,而DB服务器具有6 GB RAM.

在执行下面的脚本时,处理2百万条记录并且RAM没有释放后处理速度变得非常慢,并且在某段时间之后所有RAM都被脚本占用并且在该脚本完全没有处理之后.

正如您所看到的,我正在重置变量并关闭数据库连接,但它不会释放数据库服务器RAM.经过一番阅读,我才知道,可能是PHP垃圾收集需要手动调用以释放资源,但它也没有释放RAM.

我在这里做错了什么以及如何使用PHP,MYSQL处理数百万条记录?

在执行脚本时释放RAM的任何其他方法,以便脚本应该执行竞争?

/* Fetch records count for batch insert*/

$queryCount = "SELECT count(*) as totalRecords FROM TABLE1 where created_date > = '2018-02-10'";
$rowsCount = $GLOBALS['db']->execRaw( $queryCount)->fetchAll();

$recordsPerIteration = 50000 ;
$totalCount = $rowsCount[0]['totalRecords']; 
$start = 0;

gc_disable() ;
if ( $totalCount > 0 ) {
    while ( $totalCount > 0 ) {
    $query = "SELECT *  FROM TABLE1
                WHERE where created_date > = '2018-02-10'
                ORDER BY suggestion_id DESC 
                LIMIT ".$start.",".$recordsPerIteration;

    print …
Run Code Online (Sandbox Code Playgroud)

php mysql performance memory-leaks database-performance

5
推荐指数
1
解决办法
1291
查看次数