Nasıl bu sorguları optimize edebilirsiniz?

2 Cevap php

Aşağıdaki kod parçasını inceleyin:

$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

Temelde bu döngüleri bunların her biri bir yendi vererek tüm özellikli reklamları (86.4 saniye) Onlar özel vurgu, örnek verilecektir pencere yalak:

$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

Bu $ toplam sorgu için ihtiyacı ortadan kaldırır ve sadece tek bir sorgu kullanarak aynı gerçekleştirmek mümkün olacaktır nasılsa, ancak ben merak ediyorum, gayet güzel çalışıyor.

Ben alt sorguları kullanmadan bunu yapmak için zaten görmüyorum ama yine de, ben bu konuda fikirlerinizi duymak isterim.

2 Cevap

Hayır, bu mümkün değildir. mysql SINIR maddelerinde açık bir sabit değeri gerektirir. Bir LIMIT deyiminde bir hesaplama koyamazsınız.

Sen sorguları optimize olamaz. Ama algoritma optimize edebilirsiniz. Muhtemelen,)) bu yapmak gerekiyor, ama ...

$total >= 1000 Bazı reklamlar göstermek asla olacaktır. Herhangi bir durumda, bazı reklamların daha sonra diğerleri kez gösterilmiştir.

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