powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
8 сообщений из 8, страница 1 из 1
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38805302
Доброго времени суток, господа!
Есть такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT DISTINCT
	IF (ART_LOOKUP.ARL_KIND IN (1, 2, 3, 4), BRANDS.BRA_BRAND, SUPPLIERS.SUP_BRAND) AS BRAND,
	ART_LOOKUP.ARL_SEARCH_NUMBER AS NUMBER,
	ART_LOOKUP.ARL_KIND,
	ART_LOOKUP.ARL_ART_ID,
	DES_TEXTS.TEX_TEXT AS ART_COMPLETE_DES_TEXT
FROM
	           ART_LOOKUP
	 LEFT JOIN BRANDS ON BRANDS.BRA_ID = ART_LOOKUP.ARL_BRA_ID
	INNER JOIN ARTICLES ON ARTICLES.ART_ID = ART_LOOKUP.ARL_ART_ID
	INNER JOIN SUPPLIERS ON SUPPLIERS.SUP_ID = ARTICLES.ART_SUP_ID
	INNER JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = ARTICLES.ART_COMPLETE_DES_ID
	INNER JOIN DES_TEXTS ON DES_TEXTS.TEX_ID = DESIGNATIONS.DES_TEX_ID
WHERE
	ART_LOOKUP.ARL_SEARCH_NUMBER = '".$search."' AND
	ART_LOOKUP.ARL_KIND IN (1, 2, 3, 4) AND
	DESIGNATIONS.DES_LNG_ID = ".$LNG_ID."
GROUP BY
	BRAND,
	NUMBER
;



Переменные $search и $LNG_ID задаются таким образом:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$search_orig = $_GET['search'];
$search_first_filter = str_replace("'", '', $search_orig);
$search = str_replace(' ', '%', $search_first_filter);
$search = mysql_real_escape_string($search);

if (isset($_GET['LNG_ID'])) {
$LNG_ID = (int)$_GET['LNG_ID'];
} else { 
$LNG_ID = 16; // стандартный язык. 1 - немецкий, 4 - английский. нам нужен русский, его код - 16. 
}



скрипт создания таблицы
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
-- phpMyAdmin SQL Dump
-- version 3.3.7deb7
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Nov 13, 2014 at 05:34 PM
-- Server version: 5.1.63
-- PHP Version: 5.3.3-7+squeeze19

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `TECDOC`
--

-- --------------------------------------------------------

--
-- Table structure for table `ART_LOOKUP`
--

CREATE TABLE IF NOT EXISTS `ART_LOOKUP` (
  `ARL_ART_ID` int(11) NOT NULL DEFAULT '0',
  `ARL_SEARCH_NUMBER` varchar(105) NOT NULL DEFAULT '',
  `ARL_KIND` binary(1) NOT NULL DEFAULT '\0',
  `ARL_CTM` binary(252) DEFAULT NULL,
  `ARL_BRA_ID` smallint(6) NOT NULL DEFAULT '0',
  `ARL_DISPLAY_NR` varchar(105) NOT NULL DEFAULT '',
  `ARL_DISPLAY` smallint(6) NOT NULL DEFAULT '0',
  `ARL_BLOCK` smallint(6) NOT NULL DEFAULT '0',
  `ARL_SORT` smallint(6) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ARL_ART_ID`,`ARL_SEARCH_NUMBER`,`ARL_KIND`,`ARL_BRA_ID`,`ARL_DISPLAY_NR`(36),`ARL_DISPLAY`,`ARL_BLOCK`,`ARL_SORT`),
  KEY `ARL_SEARCH_NUMBER` (`ARL_SEARCH_NUMBER`(13),`ARL_BRA_ID`,`ARL_KIND`),
  KEY `ARL_BRA_ID` (`ARL_BRA_ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `ART_LOOKUP`
--

INSERT INTO `ART_LOOKUP` (`ARL_ART_ID`, `ARL_SEARCH_NUMBER`, `ARL_KIND`, `ARL_CTM`, `ARL_BRA_ID`, `ARL_DISPLAY_NR`, `ARL_DISPLAY`, `ARL_BLOCK`, `ARL_SORT`) VALUES
(1, '242008', '1', '0b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110', 0, '', 0, 0, 0),
(2, '242009', '1', '0b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110', 0, '', 0, 0, 0),
(3, '242015', '1', '0b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110', 0, '', 0, 0, 0),
(4, '242017', '1', '0b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110', 0, '', 0, 0, 0),
(5, '242019', '1', '0b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111110', 0, '', 0, 0, 0);




Поиск по таблице (таких записей в ней 47,491,927, всего таблица весит 14.1 гигабайт) занимает примерно 2.5 часа, что неприемлимо в принципе. Как можно оптимизировать запрос/таблицу/базу для того, что бы работа с этой и другими таблицами (80 таблиц, 84+ гигабайта веса) была быстрой?
...
Рейтинг: 0 / 0
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38805421
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Показывайте план запроса и все остальные подробности.

Общие рекомендации:
1) Выбросьте неиспользуемые записи. Как я понимаю, нужен только русский язык.
2) Выбросьте неиспользуемые поля. Сходу я не помню значения полей в текдоке, но смутно помнится, что поле ARL_CTM и еще некоторые не нужны.
...
Рейтинг: 0 / 0
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38805442
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не все поля селекта в группировке. текстовое поле в группировке. половина дждойнов не используется в селекте.

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

эксплейн?
...
Рейтинг: 0 / 0
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38805444
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И, кстати, DISTINCT одновременно с GROUP BY - вообще ерунда какая-то.
...
Рейтинг: 0 / 0
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38846376
Фотография Мих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кирилл Даншин,

Наверное группировать не стоит, действительно зачем.
Лучше сделать 2 отдельных индекса
- просто по `ARL_SEARCH_NUMBER`
- просто по `ARL_ART_ID`

И тогда у вас таблица не будет весить 14 Гиг.

После этого нужно посмотреть что все таблицы в вашем запросе используют индексы по поисковым полям
...
Рейтинг: 0 / 0
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38849585
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кирилл ДаншинДоброго времени суток, господа!
Есть такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT ART_LOOKUP.ARL_KIND,
	ART_LOOKUP.ARL_SEARCH_NUMBER AS NUMBER,
FROM ART_LOOKUP
	INNER JOIN ARTICLES ON ARTICLES.ART_ID = ART_LOOKUP.ARL_ART_ID
	INNER JOIN DESIGNATIONS ON DESIGNATIONS.DES_ID = ARTICLES.ART_COMPLETE_DES_ID
WHERE
	ART_LOOKUP.ARL_SEARCH_NUMBER = '".$search."' AND
	ART_LOOKUP.ARL_KIND IN (1, 2, 3, 4) AND
	DESIGNATIONS.DES_LNG_ID = ".$LNG_ID."
GROUP BY
	ARL_KIND,
	NUMBER
;



а за какое время такой запрос отработает? 47миллионов записей многовато, что-бы их пачкой выгребать, что вы с ними сделать хотите ( в PHP? )

как вариант ускорения, в таблицу можно было бы добавить поле DES_LNG_ID что бы получить поиск по ключу нормальный
...
Рейтинг: 0 / 0
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38851165
Фотография Мих
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NikolayV81,
Он не пачкой выгребает, а по поисковому номеру. Все норма, должно отрабатывать быстро.
Сейчас ART_LOOKUP уже занимает более 52 лимонов.
...
Рейтинг: 0 / 0
Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
    #38851249
NikolayV81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МихNikolayV81,
Он не пачкой выгребает, а по поисковому номеру. Все норма, должно отрабатывать быстро.
Сейчас ART_LOOKUP уже занимает более 52 лимонов.


"Поиск по таблице (таких записей в ней 47,491,927, ..."
Я как то подумал что это означает что поисковому запросу удовлетворяет 47е6 запмсей :)
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Бесконечный "Copying to tmp table" при поиске по 14-ти гиговой таблице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]