Php 这是Memcached中列表的可行解决方案吗?

Php 这是Memcached中列表的可行解决方案吗?,php,mysql,memcached,innodb,Php,Mysql,Memcached,Innodb,基本上,我们有销售人员的要求导致电话。现在,它尝试了一个“新线索”查询来获取这些信息 如果没有任何新的潜在客户,它将转到“相对较新”的查询。我们称这些为“来源”,本质上是一个更密切的人将通过来源,直到他们找到一个可行的线索 这些查询都查询同一个表,只是不同的数据组。然而,每个查询都有很多复杂的排序,在这和表的插入/更新(表是InnoDB)之间,我们经历了很多等待(我很确定没有死锁,因为它们在InnoDB状态下没有显示),所以我猜我们的选择很慢,加上大量的插入/更新 现在,最终的问题是: 我们应该

基本上,我们有销售人员的要求导致电话。现在,它尝试了一个“新线索”查询来获取这些信息

如果没有任何新的潜在客户,它将转到“相对较新”的查询。我们称这些为“来源”,本质上是一个更密切的人将通过来源,直到他们找到一个可行的线索

这些查询都查询同一个表,只是不同的数据组。然而,每个查询都有很多复杂的排序,在这和表的插入/更新(表是InnoDB)之间,我们经历了很多等待(我很确定没有死锁,因为它们在InnoDB状态下没有显示),所以我猜我们的选择很慢,加上大量的插入/更新

现在,最终的问题是:

我们应该为每个源查询数据库并获取大约100ish(显然根据系统的不同而不同)并将它们缓存在memcached中。然后,当收银员请求线索时,从缓存发送线索,但更新缓存以反映“已接受”标志。这样,我们只在缓存的潜在客户用完时调用每个源,所以在缓存的潜在客户用完时只调用一次,而不是在每个客户请求潜在客户时调用一次

然后我们可以使用memcached-


这似乎是一个可行的解决方案吗?有什么建议吗?我们需要最大限度地减少锁死死地快速等待的可能性。

听起来可行,但您是否查看了索引,是否在选择上使用了适当的隔离级别

前面的SO问题可能有助于回答您的问题:

如果在具有完整事务的SP中执行选择/更新,由于优化,这也会大大加快速度。当然,有时MySQL中的SP速度要慢得多:(

我会将此作为一个评论,但还没有达到那个水平:)


我确实读过关于inno db的部分,但经验告诉我,即使使用inno,在使用隔离级别时也有改进。

在使用另一个数据存储之前,您一定要确保数据库查询得到充分优化


如果你决定缓存这个数据,那么考虑使用ReDIS,它使列表成为第一类公民。 READ COMMITTED本质上很慢,因为它必须等待缓存和缓冲区刷新才能依赖于数据完整性。您考虑过临时锁吗?您可以使用高ID对表执行更新,并且is_accepted=false并返回记录,如果代理没有接收您翻转的记录,那么它将返回到链中。什么是更好的解决方案/隔离级别?>什么是更好的解决方案/隔离级别?READ UNCOMMITTED不需要相同的锁定,但代价是脏数据readsUNCOMMITTED更快,因为它可以忽略缓存/缓冲区刷新。IE:它可以在内存中读取记录,而不是从磁盘读取。几乎就像一个肮脏的阅读,只有(如果我没记错的话)你不会得到腐败的记录。唯一的问题是我们已经在一定程度上实现了memcached。我宁愿管理1个缓存,直到需要第二个缓存。我们做了索引,这确实有帮助!