Большая проблема вставки таблицы записей Mysql - PullRequest
0 голосов
/ 09 мая 2011

Я разработчик, и я сталкиваюсь с проблемой при управлении таблицей с большим количеством записей.

Я выполняю задание cron для заполнения данных в первичной таблице (таблица A), которая имеет 5-6 столбцов и приблизительно от 4 000 000 до 5 000 000 строк, а затем создаю другую таблицу, и данные в этой таблице будут продолжать увеличиваться со временем.

ТАБЛИЦА A содержит необработанные данные, а моя таблица вывода - ТАБЛИЦА B

Мой скрипт cron обрезает данные в таблице B, а затем вставляет данные с помощью запроса select

TRUNCATE TABLE_B; 

INSERT INTO TABLE_B (field1, field2) 
SELECT DISTINCT(t1.field2), t2.field2 
FROM TABLE_A AS t1 
INNER JOIN TABLE_A t2 ON t2.field1=t1.field1 
WHERE t1.field2 <> t2.field2 
GROUP BY t1.field2, t2.field2 
ORDER BY COUNT(t1.field2) DESC; 

Выше выборочный запрос производит примерно от 1,500 000 до 2 000 000 строк

Теперь заполнение ТАБЛИЦЫ B занимает слишком много времени, и в то же время. Если мое приложение пытается получить доступ к ТАБЛИЦЕ B, тогда запрос выбора завершается неудачей

Объяснение результатов запроса следующее:

'1','PRIMARY','T1','ALL','field1_index',NULL,NULL,NULL,'431743','Using temporary;Using filesort' 
'1','PRIMARY','T2','ref','field1_index','field1_index','767','DBNAME.T1.field1','1','Using where' 

Может кто-нибудь помочь мне в улучшении этого процесса или подсказать альтернативы для вышеуказанного процесса?

Спасибо

Suketu

Ответы [ 2 ]

0 голосов
/ 09 мая 2011

По моему мнению, решение будет выглядеть следующим образом:

SELECT 
    DISTINCT(t1.field2), t2.field2 
    FROM 
        TABLE_A AS t1
    INNER JOIN 
        TABLE_A t2 ON 
        t2.field1=t1.field1 
    WHERE
        t1.field2 <> t2.field2 
    GROUP BY
        t1.field2, t2.field2 
    ORDER BY
       COUNT(t1.field2)
    DESC INTO OUTPUT "PATH-TO-FILE";

Например, файл "C: \ TEMP \ DATA1.SQL".Что произойдет с этим запросом, будет создан простой новый файл с разделителем TAB для вставки в любую таблицу.Теперь, как импортировать данные в таблицу.

LOAD DATA
    "PATH-TO-FILE"
INTO TABLE
     table_name

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

0 голосов
/ 09 мая 2011

Вы должны выполнить весь процесс в хранимой процедуре.

Не обрезайте такую ​​большую таблицу. Выполните следующие действия:

  1. Скопируйте структуру TableB в TableB_Copy.
  2. DROP TABLEB.
  3. Переименовать TableB_Copy в TableB
  4. Отключить индексы в TableB
  5. Вставить данные из таблицы A в таблицу B
  6. Создание индексов для таблицы B.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...