За последние 24 часа нас посетили 54127 программистов и 1719 роботов. Сейчас ищут 846 программистов ...

Оптимизация запроса

Тема в разделе "MySQL", создана пользователем simple, 11 ноя 2010.

  1. simple

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

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    Народ помогите с оптимизацией запроса. Есть таблица куда добавляют свои записи юзеры, пример
    [sql]CREATE TABLE `last_message` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `user` CHAR(10) NOT NULL,
    `message` TEXT NOT NULL,
    `data` DATETIME NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `user` (`user`)
    )
    ENGINE=MyISAM
    [/sql]
    Делаю запрос на выборку последних вставленных записей юзерами
    [sql]
    SELECT*FROM `last_message` GROUP BY user DESC
    [/sql]

    EXPLAIN:

    [sql]
    table type possible_keys key key_len ref rows Extra
    1 SIMPLE last_message ALL (NULL) (NULL) (NULL) (NULL) 29 Using temporary; Using filesort
    [/sql]
    Почему запрос затрагивает все 29 записей в таблице? Нельзя ли этот запрос как то улучшить?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    simple
    дык ты ж никак его не ограничил. просишь отдать все - он все и отдает, в чем затык?
     
  3. simple

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

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    а как ограничить? мне нужно чтобы запрос выдавал самые последнии записи всех юзеров
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    simple
    а что для тебя самые последние?
     
  5. simple

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

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    последнии на момент этого запроса
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я понял. ты хочешь по одной самой последней с каждого пользователя?
    а если их будет тысяча? =)
     
  7. simple

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

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    нет, тысяча не будет, но 20-30 вполне может быть, а что это ресурсоемкий запрос что ли?
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я бы сделал у каждого юзера в профиле доп два поля - номер и дату последнего поста. и по этим полям бы выбирал. так было бы просто и быстро.
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    но я думаю можно с дистинктом поиграться
     
  10. simple

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

    С нами с:
    17 сен 2010
    Сообщения:
    56
    Симпатии:
    0
    Есть такое решение задачи:
    [sql]
    SELECT* FROM `last_message`
    WHERE `id` IN(
    SELECT MAX(`id`)
    FROM `last_message`
    GROUP BY user)
    [/sql]
    НО, проверив это запрос EXPLAINom хотелось бы его улучшить =)
    [sql]
    id select_type table type possible_keys key key_len ref rows Extra
    1 PRIMARY last_message ALL NULL NULL NULL NULL 30 Using where
    2 DEPENDENT SUBQUERY last_message index NULL symbol 30 NULL 1 Using filesort
    [/sql]