|
|
|
| В базе 156000 записей
При добавлении или удалении индекса виснет майскул, процессор занят на 50%
Запросы типа JOIN тоже виснут, ту же таблицу подключаю | |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 02:11)
| | А как часто добавляются и удаляются индексы? Вроде это операция проводится один раз... и в общем должна быть довольно трудоемкой. Или имеется в виду добавление записей?
PS Каков объем таблицы в мегабайтах и как она проиндексирована? | |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 08:56)
| | Индексы добавляю один раз при проектировании БД и не собираюсь далее удалять или добавлять записи и индексы. Просто интересно почему так виснет сильно. Если одновременно добавлять индекс 2-3 столбцам, то это вообще убийство для майскула | |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 14:11)
| | Это нормально... в больших базах данных и по 2 суток эти операции проходят и не на серверах, а на таких средних суперкомпьютерах. Вам по сути нужно воссоздать таблицу базу данных (пусть и в меньших масштабах), отсортированную физически по своим полям. Чем больше объем таблицы - тем медленнее эта операция происходит. | |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 08:56)
| | вот для того чтобы понимать что за база
id_car year mark_name mark_id model_name model_id vol_engine type_fuel horse_power type_drive type_body gear_box
1 1971 Alfa Romeo 8 75 223 1.7 Petrol 109 RWD Sedan
2 1971 Alfa Romeo 8 75 223 1.8 Petrol 113 RWD Sedan
3 1971 Alfa Romeo 8 75 223 2.0 Petrol 132 RWD Sedan
4 1971 Alfa Romeo 8 GT 1094 1.3 Petrol 87 RWD Coupe TT
5 1971 Alfa Romeo 8 GT 1094 1.3 Petrol 110 RWD Coupe
|
| |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 14:12)
| |
CREATE TABLE IF NOT EXISTS `cars` (
`id_car` int(5) NOT NULL AUTO_INCREMENT,
`year` int(4) NOT NULL,
`mark_name` varchar(100) NOT NULL,
`mark_id` int(5) NOT NULL,
`model_name` varchar(100) NOT NULL,
`model_id` int(5) NOT NULL,
`vol_engine` varchar(20) NOT NULL,
`type_fuel` varchar(20) NOT NULL,
`horse_power` int(3) NOT NULL,
`type_drive` varchar(5) NOT NULL,
`type_body` varchar(20) NOT NULL,
`gear_box` varchar(20) NOT NULL,
`body_code` varchar(100) NOT NULL,
`engine_code` varchar(100) NOT NULL,
`model_market` varchar(100) NOT NULL,
`other_data` varchar(256) NOT NULL,
PRIMARY KEY (`id_car`),
KEY `year` (`year`),
KEY `mark_name` (`mark_name`),
KEY `mark_id` (`mark_id`),
KEY `model_name` (`model_name`),
KEY `model_id` (`model_id`),
KEY `vol_engine` (`vol_engine`),
KEY `type_fuel` (`type_fuel`),
KEY `horse_power` (`horse_power`),
KEY `type_body` (`type_body`),
KEY `type_drive` (`type_drive`),
KEY `gear_box` (`gear_box`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=156264 ;
|
| |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 14:14)
| | А каков её объем в мегабайтах? | |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 14:16)
| | 21 мб | |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 14:18)
| | Для интереса посмотрите сколько индекс места занимает? | |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 14:24)
| | Хм.. очень интересно:
Используемое пространствоТип Использование
Данные 10,992.3 КБ
Индекс 10,486.0 КБ
Всего 21,478.3 КБ
|
| |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 14:26)
| | Ну за счет того, что данные в индексе отсортированы, поиск конечно будет осуществляться быстрее, чем по таблице. Однако, эффект конечно от индексов будет гораздо меньше, чем если бы их объем был раз в 10 меньше. Кроме того, такой файл индексов здорово замедлит операции удаления, вставки и обновления данных в таблице.
PS Кстати интересно, у вас числовые значения практически не индексированы, а проиндексированы строковые. Это сделано намерено? | |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 15:00)
| | да, сделано намеренно, потому что в запросах участвуют тлько первые 6 стоблцов | |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 15:15)
| | вот запрос такого вида делаю. Может быть конечно я делаю это неправильно - после майских физических нагрузок мозг притормаживает - но от запроса виснет:
SELECT mk.year, mk.mark_name, md.model_name FROM `cars` AS y
LEFT JOIN cars AS mk ON mk.year = y.year
LEFT JOIN cars AS md ON md.mark_id = mk.mark_id
WHERE y.year = 2009
|
| |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 15:18)
| | Индекс не влияет вот на это
>SELECT mk.year, mk.mark_name, md.model_name FROM `cars` AS y
В первую очередь он влияет на
>WHERE y.year = 2009
Во вторую на
>ON mk.year = y.year
>ON md.mark_id = mk.mark_id | |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 15:18)
| | Собственно используется индекс или нет, можно посмотреть при помощи оператора EXPLODE
EXPLODE SELECT mk.year, mk.mark_name, md.model_name FROM `cars` AS y
LEFT JOIN cars AS mk ON mk.year = y.year
LEFT JOIN cars AS md ON md.mark_id = mk.mark_id
WHERE y.year = 2009
|
| |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 15:32)
| | Ты наверное имел ввиду EXPLAIN, понял, проверю ща | |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 15:59)
| | запрос немного исправил:
EXPLAIN SELECT mk.year, mk.mark_name, md.model_name
FROM cars AS y
LEFT JOIN cars AS mk ON mk.year = y.year
LEFT JOIN cars AS md ON md.mark_id = mk.mark_id
WHERE y.year =2009
|
результат:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE y ref year year 4 const 6903 Using index
1 SIMPLE mk ref year year 4 const 6903
1 SIMPLE md ref mark_id mark_id 4 automobiles.mk.mark_id 2368
|
| |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 16:10)
| | Ну вроде все впорядке ключи используются. Сколько времени запрос выполняется и где (сервер, локальная машина)? | |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 17:14)
| | локальна машина. Но запрос этот выполняется неопределенное время. Просто виснет и все | |
|
|
|
|
|
|
|
для: Ильдар
(04.06.2011 в 18:14)
| | Это нормально. Во-первых у локальных машин очень слабая подсистема ввода-вывода, даже на самых простецких серверах она обычно значительно сильнее. Во-вторых у вас наверняка не очень сильно настроен MySQL и не "разогрет", так как у вас нет большого количества обращений и вы не можете заполнить кэши, даже если они настроены. Работать с большой базой локально - это действительно морока (многие операции протекают слишком долго). | |
|
|
|
|
|
|
|
для: cheops
(04.06.2011 в 18:18)
| | действительно на хостинге запросы сработал в разы быстрей и без повисонов.
и я знаю почему у меня виснет комп. потому что результат запроса выводит 8 млн записей. Вот поэтому и проблема. А запрос выполняется нормально 0.0169 сек. | |
|
|
|