Php 如何优化这些查询?
考虑以下代码段:Php 如何优化这些查询?,php,sql,mysql,math,Php,Sql,Mysql,Math,考虑以下代码段: $beat = date('B'); // 1 beat = 86.4 seconds, 1000 beats = 1 day $total = 'SELECT COUNT(id) FROM ads WHERE featured = 1;'; // number of featured ads $current = 'SELECT * FROM ads WHERE featured = 1 ORDER BY id ASC LIMIT 1 OFFSET ' . ($beat %
$beat = date('B'); // 1 beat = 86.4 seconds, 1000 beats = 1 day
$total = 'SELECT COUNT(id) FROM ads WHERE featured = 1;'; // number of featured ads
$current = 'SELECT * FROM ads WHERE featured = 1 ORDER BY id ASC LIMIT 1 OFFSET ' . ($beat % $total) . ';'; // current featured ad
基本上,这一循环贯穿于所有特色广告中,为每个广告提供一个节拍(86.4秒)窗口,在该窗口中,他们将获得特别的亮点,例如:
$beat $total $current
0 3 0
1 3 1
2 3 2
3 3 0
4 3 1
5 3 2
6 3 0
7 3 1
这工作得很好,但是我想知道是否有可能消除对$total查询的需要,并且只使用一个查询就可以完成相同的任务
我不认为不使用子查询就可以这样做,但我还是想听听您对此的意见。不,这是不可能的。mysql在LIMIT子句中需要一个显式常量值。您不能将计算放在LIMIT子句中。您不能优化查询。但你们可以优化算法。也许,您确实需要这样做,但是……)
$current = 'SELECT *, FOUND_ROWS(id) as num FROM ads WHERE featured = 1 ORDER BY id ASC LIMIT 1 OFFSET MOD(' . $beat . ', num)';
如果$total>=1000
您将永远不会显示某些广告。在任何情况下,某些广告显示的次数比其他广告多
long timestamp = ... // standard timestamp in millis
long period = 86400; // millis
long total = ... // you total query
long offset = (timestamp / period) % total;
current = ... // you last query, but with my offset
最后一个查询不应该只选择featured=1的查询吗?给定数据集,您可以用3替换$total。也许你想给出一个更丰富的例子?@lanut:是的,很抱歉,现在已经解决了。@Robert:这只是一个例子,$total当然可以是任何给定的数字。LIMIT 1子句不会影响计数函数吗?是的,谢谢你的提示。应该使用find_ROWS()而不是在LIMIT子句中使用显式常量值。您不能在限制条款中进行计算。您能建议其他解决方法吗?仅仅为此做两个查询似乎太麻烦了。这算是一个优化吗?我仍然需要做2次查询,算法基本相同,我省略了$total的1000限制,因为这很琐碎,很难解决,只会给问题增加噪音。我的第一句话:“你不能优化查询”。因此,这不是优化。