Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MySql + обновление индекса, MySql + обновление индекса 
:(
    Опции темы
Artemon
Дата 9.7.2008, 06:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Использую MySql 5.*

В одной из таблиц определен индекс по числовому полю, но постепенно при вставках данных - этот индекс разбалтывается и разбалтывается на столько, что с БД невозможно работать - запросы занимают несколько минут (с индексом пару секунд), так вот как можно автоматически пересчитывать индексы к пимеру каждый день ?




--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
skyboy
Дата 9.7.2008, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Artemon @  9.7.2008,  05:24 Найти цитируемый пост)
этот индекс разбалтывается

может, пояснишь, что ты имеешь в виду? художественніе примемы зороши только не в ущерб смыслу
PM MAIL   Вверх
Feldmarschall
Дата 9.7.2008, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



Artemon, твое понимание смысла индексов оставляет желать лучшего. 
И твои предположения о причинах задержек неверны. 

поэтому задавая вопрос, как тебе ускорить тот или иной запрос, следует писать только две вещи:
1. сам запрос
2. вывод  EXPLAIN с этим запросом.
(если бы кто-нибудь когда-нибудь читал правила, то я бы предложил внести это в правила форума.)
PM   Вверх
Artemon
Дата 9.7.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 1
Всего: 20



Что я понимаю под словом "разболтался" - в таблицу были добавлены новые данные и индекс необходимо пересчитать.

Цитата

И твои предположения о причинах задержек неверны. 


Всетаки я думаю мои предположения верны, объясню.
В бд постоянно добавляются новые записи (примерно 1 запись в секунду круглосуточно).
Постепенно запросы к БД начинают выполняться медленнее, после того, как я сношу индекс и создаю его заново - все нормализуется, поэтому я и предположил что индекс нужно постоянно пересчитывать.

А запросы большие и сложные, но если кто-то посмотрит на них и прокомментирует - буду рад.

Код

DELIMITER $$

DROP PROCEDURE IF EXISTS `LOCARUS`.`Get_DATA` $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `Get_DATA`(
IN _IMEI nvarchar(50),
IN _SERIAL_COMPUTER_NUMBER nvarchar(50),
OUT _Ret bigint,
IN _StartID bigint
)
BEGIN
    declare _MyMax bigint;

    SELECT max(DATA.ID_DATA) INTO _Ret FROM DATA
    INNER JOIN DEVICES ON DEVICES.ID_DEVICE = DATA.ID_DEVICE
    WHERE IMEI_NAME = _IMEI;

       SELECT _Ret;
    

    SELECT MAX(POINTER)  INTO _MyMax FROM SERIALS 
    INNER JOIN DEVICES ON DEVICES.ID_DEVICE = SERIALS.ID_DEVICE
    INNER JOIN SERIAL_LIST ON SERIAL_LIST.ID_SERIAL_LIST = SERIALS.ID_SERIAL_LIST
    WHERE IMEI_NAME = _IMEI
    AND SERIAL = _SERIAL_COMPUTER_NUMBER;
    
    

        IF EXISTS
            ( 
            SELECT DEVICES.ID_DEVICE FROM DEVICES
                    INNER JOIN SERIALS ON SERIALS.ID_DEVICE = DEVICES.ID_DEVICE
                    INNER JOIN SERIAL_LIST ON SERIAL_LIST.ID_SERIAL_LIST = SERIALS.ID_SERIAL_LIST
            WHERE SERIAL = _SERIAL_COMPUTER_NUMBER 
            AND IMEI_NAME = _IMEI 
            LIMIT 1
            )        
            THEN
                SELECT DATA_SIZE,DATA, ID_DATA
                FROM DATA
                INNER JOIN DEVICES ON DATA.ID_DEVICE = DEVICES.ID_DEVICE 
                INNER JOIN SERIALS ON SERIALS.ID_DEVICE = DEVICES.ID_DEVICE
                INNER JOIN SERIAL_LIST ON SERIAL_LIST.ID_SERIAL_LIST = SERIALS.ID_SERIAL_LIST
                WHERE
                    (
                    DATA.ID_DATA > _MyMax
                    )
                AND SERIAL = _SERIAL_COMPUTER_NUMBER 
                AND IMEI_NAME = _IMEI
                AND DATA.ID_DATA <= _Ret
                AND DATA.ID_DATA > _StartID
                ORDER BY ID_DATA
                LIMIT 1000
                ;
            ELSE
                SELECT DATA_SIZE,DATA, ID_DATA
                FROM DATA 
                INNER JOIN DEVICES ON DATA.ID_DEVICE = DEVICES.ID_DEVICE 
                AND IMEI_NAME = _IMEI
                AND DATA.ID_DATA <= _Ret
                AND DATA.ID_DATA > _StartID
                ORDER BY ID_DATA
                LIMIT 1000
                ;
            END IF;

END $$

DELIMITER ;



--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Feldmarschall
Дата 9.7.2008, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



Индекс так устроен, что он сам перестраивается. не "раз в день", а после каждой вставки, его затрагивающей.
А запрос и правда забавный.
PM   Вверх
MuToGeN
Дата 13.7.2008, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


Профиль
Группа: Модератор
Сообщений: 4379
Регистрация: 15.8.2002
Где: Москва

Репутация: нет
Всего: 32



Feldmarschall, есть исключение - mysqld любит рушить индексы, когда приходится работать с действительно объемными базами.
Из своей практики: ISPшная биллинговая система, таблица, хранящая в себе логи трафика, кто что скачал. Таблица обновляется раз в минуту. Без вырубания mysqld для оптимизации таблиц, myisamchk и прочего оно успешно кладется само по себе.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.