За последние 24 часа нас посетили 17767 программистов и 1677 роботов. Сейчас ищут 889 программистов ...

Помогите оптимизировать sql выборку

Тема в разделе "PHP и базы данных", создана пользователем diselvin2016, 30 дек 2016.

  1. diselvin2016

    diselvin2016 Новичок

    С нами с:
    30 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Всем доброго дня. Для выборки из таблицы случайной записи, набрасал код ниже. Есть 2 таблицы: table1 и table2. В table1 - множество str(записей), из неё, в зависимости от IP обратившегося, необходимо выводить случайную запись(str) лишь один раз. Т.е. одна и таже, для конкретного IP выводиться не должна! В table2 - сохраняются все ранее выведенные из table1 записи. Из неё выбираются все id'ы ранее выведенных для определённого IP и исключаются из sql условия. Код собственно работает. Но вот в оптимизации я не дальновиден. Всё ли на Ваш взгляд корректно? Спасибо за внимание =)

    Код:
    PHP:
    1. <?php
    2. $cnnect = mysql_connect('localhost', 'root', 'PaSSwOD');
    3. mysql_select_db('dbase');
    4.  
    5. $code = mysql_query("SELECT id FROM table2 WHERE IP='".$_SERVER["REMOTE_ADDR"]."'");
    6. $id = array();
    7.  
    8. while($rows = mysql_fetch_row($code)){
    9. $id[] = $rows[0];
    10. }
    11.  
    12. if (!empty($id)){
    13. $query = "SELECT id,str FROM table1 WHERE id NOT IN ( '" . implode($id, "', '") . "' ) ORDER BY RAND() LIMIT 1";
    14. }
    15. else
    16. {
    17. $query = 'SELECT id,str FROM table1 ORDER BY RAND() LIMIT 1';
    18. }
    19. $result = mysql_query($query);
    20.  
    21. if ($result) {
    22.   $per = mysql_fetch_array($result);
    23.   if (!empty($per['str'])) {
    24. mysql_query("INSERT INTO table2 (id,ip,str,time) VALUES('".$per['id']."','".$_SERVER["REMOTE_ADDR"]."', '".$per['str']."', NOW());");
    25.   }
    26.  
    27. }
    28.  
    29.  
    30. mysql_close($cnnect);
    31. ?>
     
    #1 diselvin2016, 30 дек 2016
    Последнее редактирование модератором: 2 янв 2017
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Во первых, ты мог спокойно засунуть первый select в подзапрос внутри in(). Прокачивать данные через пхп это напрасная трата времени.
    Во вторых, Not in() считается тяжёлым решением, хотя и оно наглядно. Выгоднее сделать left join и условие is null.
     
    diselvin2016 нравится это.
  3. diselvin2016

    diselvin2016 Новичок

    С нами с:
    30 дек 2016
    Сообщения:
    8
    Симпатии:
    0
    Огромное Вам спасибо) Сейчас попробую изменить механизм запросов по Вашему совету!
     
  4. retvizan

    retvizan Активный пользователь

    С нами с:
    27 дек 2013
    Сообщения:
    68
    Симпатии:
    22