[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите оптимизировать код
spiderbuber
Помогите оптимизировать код
Вывожу на главной странице 3 разных статьи (самая новая, самая лучшая, самая отправляемая).
Делаю это так:
PHP
  1.  
  2. $a = "SELECT * FROM posttxt where validate='1' and (date_add between '".date('Y-m-d',mktime (0,0,0,date('m'),date('d')-$newperiod-1,date('Y')))."' and '".date('Y-m-d')."') ORDER BY date_add DESC limit 1";
  3. $b = mysql_query($a) or die(mysql_error());
  4.  
  5. $a1 = "SELECT * FROM posttxt where validate='1' ORDER BY rate DESC limit 1";
  6. $b1 = mysql_query($a1) or die(mysql_error());
  7. $c1 = mysql_fetch_array($b1);
  8.  
  9. $a2 = "SELECT * FROM posttxt where validate='1' ORDER BY emailed DESC limit 1";
  10. $b2 = mysql_query($a2) or die(mysql_error());
  11. $c2 = mysql_fetch_array($b2);
  12.  
  13. ...
  14. echo ".$c['text'].";
  15. echo ".$c1['text'].";
  16. echo ".$c2['text'].";
  17.  

А как это можно сделать не через жопу? smile.gif



Спустя 12 минут, 22 секунды (22.02.2007 - 21:32) plazix написал(а):
я б не сказал, что это через жопу

можно засунуть все в один запрос, объединив имеющиеся 3 оператором UNION

Спустя 3 минуты, 43 секунды (22.02.2007 - 21:36) Timok написал(а):
как-то странно ты вычисляешь макс. значение...
Код
SELECT * FROM posttxt where validate='1' ORDER BY rate DESC limit 1


обычно делают проще
Код
SELECT MAX(`rate`) FROM `posttxt` WHERE `validate`=1


хотя не знаю есть ли здесь существенная разница...

Спустя 13 минут, 5 секунд (22.02.2007 - 21:49) plazix написал(а):
Цитата(Timok @ 22.2.2007, 19:36) [snapback]14021[/snapback]

обычно делают проще
Код
SELECT MAX(`rate`) FROM `posttxt` WHERE `validate`=1



насколько я помню MAX(`rate`) возвращает максимальное значение в столбце rate , а не строку, где rate максимально

Спустя 23 минуты, 59 секунд (22.02.2007 - 22:13) Timok написал(а):
ну тогда можно так
Код
SELECT * FROM `posttxt` WHERE `rate`=(SELECT MAX(`rate`) FROM `posttxt` WHERE validate=1)

хотя то же извращения... и может не работать в старых версиях мускула

Спустя 28 минут, 34 секунды (22.02.2007 - 22:42) Patrick написал(а):
Цитата

SELECT * FROM posttxt where validate='1' and (date_add between '".date('Y-m-d',mktime (0,0,0,date('m'),date('d')-$newperiod-1,date('Y')))."' and '".date('Y-m-d')."') ORDER BY date_add DESC limit 1"


Полный изврат! between работает намного медленне, чем union

Спустя 50 минут, 32 секунды (22.02.2007 - 23:32) plazix написал(а):
Цитата(Timok @ 22.2.2007, 20:13) [snapback]14023[/snapback]

ну тогда можно так
Код
SELECT * FROM `posttxt` WHERE `rate`=(SELECT MAX(`rate`) FROM `posttxt` WHERE validate=1)

хотя то же извращения... и может не работать в старых версиях мускула


про LIMIT 1 забыл, надо выбрать только одну статью

Код
mysql> CREATE TABLE test (
    -> id INT(11) NOT NULL AUTO_INCREMENT,
    -> txt TEXT NOT NULL,
    -> date DATETIME,
    -> validate CHAR,
    -> rate INT(11) NOT NULL,
    -> PRIMARY KEY(id)
    -> );
Query OK, 0 rows affected (0.50 sec)

.................................................................

mysql> EXPLAIN SELECT * FROM test WHERE validate='1' ORDER BY date DESC LIMIT 1;

+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra                       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL |    NULL | NULL | 32768 | Using where; Using filesort |
+----+-------------+-------+------+---------------+------+---------+------+-------+-----------------------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT * FROM test WHERE validate='1' AND rate=(SELECT MAX(rate) FROM test WHERE validate='1') LIMIT 1;
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows  | Extra       |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
|  1 | PRIMARY     | test  | ALL  | NULL          | NULL |    NULL | NULL | 32768 | Using where |
|  2 | SUBQUERY    | test  | ALL  | NULL          | NULL |    NULL | NULL | 32768 | Using where |
+----+-------------+-------+------+---------------+------+---------+------+-------+-------------+
2 rows in set (0.01 sec)


в первом варианте используется filesort (что увеличивает время выполнения запроса), а во втором обрабатывается в 2 раза больше строк, впринципе при не большом количестве данных они равносильны (но предпочтительней на мой взгляд второй запрос), при этом первый проще и понятней, ну и короче smile.gif . При увеличении строк до полумеллиона - время выполнение второго вырастает примерно в 20-30 раз.

Спустя 2 минуты, 21 секунда (22.02.2007 - 23:34) larin написал(а):
spiderbuber
Если выбирать между 3-мя запросами либо "одним" с union
Я бы на твоем месте выбрал 3 запроса.

Спустя 5 минут, 59 секунд (22.02.2007 - 23:40) plazix написал(а):
Цитата(larin @ 22.2.2007, 21:34) [snapback]14031[/snapback]

spiderbuber
Если выбирать между 3-мя запросами либо "одним" с union
Я бы на твоем месте выбрал 3 запроса.

угу, я для примера привел

единственное что здесь надо оптимизировать так это
Цитата
PHP
  1. $a = "SELECT * FROM posttxt where validate='1' and (date_add between '".
  2. $date('Y-m-d',mktime (0,0,0,date('m'),date('d')-$newperiod-1,date('Y')))."' and '".date('Y-m-d')."') ORDER BY date_add DESC limit 1";

Спустя 51 минута, 7 секунд (23.02.2007 - 00:32) Patrick написал(а):
Лучше послушай что тебе люди говорят....

Сталкивался с проблемами когда подобные запросы на одной машине работают, на другой просто валятся...

Спустя 11 часов, 37 минут, 51 секунда (23.02.2007 - 12:09) spiderbuber написал(а):
OK! Примем к сведению. Я же хотел как-то вот это сократить:
PHP
  1.  
  2. $b = mysql_query($a) or die(mysql_error());
  3.  

Т.к. оно встречается 3 раза подряд. Можно же как-то это сделать? Условия где-нибудь натыкать?

Спустя 27 минут, 59 секунд (23.02.2007 - 12:37) plazix написал(а):
ну тут сокращать особо не чего, можно вынести в отдельную функцию, например

PHP
  1. function query($sql) {
  2. $result = mysql_query($sql) or die(mysql_error());
  3. return mysql_fetch_array($result);
  4. }

но необходимости в этом я не вижу

Цитата
Условия где-нибудь натыкать?
?????


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.