Тупит SELECT * FROM

Тема в разделе "Базы данных", создана пользователем goodvin, 2 июн 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Query_time: 1.160518 Lock_time: 0.000049 Rows_sent: 20 Rows_examined: 182018
    use board;
    SET timestamp=1275468732;
    SELECT * FROM board ORDER BY ad_date desc LIMIT 61829,20;
    Сервер

    2 Х CPU S1366 E5506 XEON 2,13GHz/4MB//800MHz
    4 Х DDR3 4GB/1333 (PC10600) ECC REG
    SAS RAID ADAPTEC 2405 PCI-E 128MB Kit
    Seagate Cheetah 15K.6 147Gb, 15000rpm, SAS


    SQL висит на SAS
    Больше никто не грузит сервак.

    Таблица:

    CREATE TABLE `board` (
    `ad_id` int(11) NOT NULL auto_increment,
    `ad_owner` int(11) default '0',
    `ad_cat_id` int(11) default '0',
    `ad_title` varchar(255) default '0',
    `ad_description` text,
    `ad_date` int(11) default '0',
    `ad_date_expire` int(11) default '0',
    `ad_date_updated` int(11) default '0',
    `ad_expires_after_days` int(11) default '0',
    `ad_owner_notified` tinyint(1) default '0',
    `ad_has_video` tinyint(1) default '0',
    `ad_has_picture` tinyint(1) default '0',
    `ad_has_doc` int(11) default '0',
    `ad_views` int(11) default '0',
    `ad_votes` varchar(11) default '0',
    `ad_voters` varchar(11) default '0',
    `ad_totalscore` varchar(11) default '0',
    `ad_last_vote_ip` longtext NOT NULL,
    `ad_is_validated` tinyint(1) default '0',
    `ad_is_sold` tinyint(1) default '0',
    `ad_is_special` tinyint(1) default '0',
    `ad_is_premium` tinyint(1) default '0',
    `ad_related` text,
    PRIMARY KEY (`ad_id`),
    KEY `ad_owner` (`ad_owner`),
    KEY `ad_cat_id` (`ad_cat_id`),
    KEY `ad_date` (`ad_date`),
    KEY `ad_date_expire` (`ad_date_expire`),
    KEY `ad_date_updated` (`ad_date_updated`),
    KEY `ad_has_video` (`ad_has_video`),
    KEY `ad_has_doc` (`ad_has_doc`),
    KEY `ad_views` (`ad_views`),
    KEY `ad_votes` (`ad_votes`),
    KEY `ad_voters` (`ad_voters`),
    KEY `ad_totalscore` (`ad_totalscore`),
    FULLTEXT KEY `search` (`ad_title`,`ad_description`)
    ) ENGINE=MyISAM AUTO_INCREMENT=172485 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=172485 ;


    Подскажите что не так, висел на ВПС данный запрос был 4-20 сек.

    ВПС проц 1000 г и память 1000 мб
     
  2. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102
    попробуй вместо полной выборки * указать конкретно те поля, которые тебе нужны. а можно просто разбить запрос на составной:

    Код:
    select * from (SELECT * FROM board ORDER BY ad_date desc) LIMIT 61829,20; 
    прежде чем написать что это одно и тоже что и твой запрос, попробуй выполнить.
     
  3. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Ответ MySQL:
    #1248 - Every derived table must have its own alias

    на локале этот выполняется 3 сек. а обычный 0.1
     
  4. diavolic

    diavolic

    Регистр.:
    17 мар 2010
    Сообщения:
    522
    Симпатии:
    102

    Код:
    select * from (SELECT * FROM board ORDER BY ad_date desc) as tmp_query LIMIT 61829,20;
     
  5. gre4a

    gre4a Создатель

    Регистр.:
    19 мар 2009
    Сообщения:
    10
    Симпатии:
    2
    а что показывает explain ?
    для mysql выполни
    explain SELECT * FROM board ORDER BY ad_date desc LIMIT 61829,20;
    explain select * from (SELECT * FROM board ORDER BY ad_date desc) LIMIT 61829,20;
     
  6. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    explain SELECT * FROM board ORDER BY ad_date desc LIMIT 61829,20;

    id select_type table type possible_keys key key_len ref rows Extra

    1 SIMPLE board ALL NULL NULL NULL NULL 121046 Using filesort

    я так понимаю индексы тут не юзат
     
  7. gre4a

    gre4a Создатель

    Регистр.:
    19 мар 2009
    Сообщения:
    10
    Симпатии:
    2
    да не используется.
    попробуй заставить
    SELECT * FROM board force index (ad_date) ORDER BY ad_date desc LIMIT 61829,20;
    и заодно проверь индексы
    show CREATE TABLE `board`
     
  8. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    Если форсировать, еще медленее работает

    Вроде все понял, нету индекса, тк. я базу токо перенес, и эти строки еще не проиндексированы.
    Может я и не прав...

    ша поудаляю индексы которые не юзаю, и посмотрю как че...
     
  9. unsiker

    unsiker

    Регистр.:
    6 июн 2008
    Сообщения:
    465
    Симпатии:
    172
    Тебе нужно всего лиш 20 записей, нафига тебе пересортировывать всю таблицу c 61 тыс. записей?
    Сделай дополнительное условие по дате ad_date (или лучше по первичному ключу ad_id, если возможно).
    Приблезительно так
    SELECT * FROM board WHERE (ad_date > какое то timestamp значение ) ORDER BY ad_date desc LIMIT 0,20;
     
  10. goodvin

    goodvin Человек-Волшебник

    Регистр.:
    27 июн 2006
    Сообщения:
    667
    Симпатии:
    687
    все очень банально скул смонтирован был на обычный системный винт 7200 а не на SAS 15000
     
Статус темы:
Закрыта.