Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Долго удаляет и добавляет индексы
 
 автор: Ильдар   (04.06.2011 в 02:11)   письмо автору
 
 

В базе 156000 записей
При добавлении или удалении индекса виснет майскул, процессор занят на 50%

Запросы типа JOIN тоже виснут, ту же таблицу подключаю

  Ответить  
 
 автор: cheops   (04.06.2011 в 08:56)   письмо автору
 
   для: Ильдар   (04.06.2011 в 02:11)
 

А как часто добавляются и удаляются индексы? Вроде это операция проводится один раз... и в общем должна быть довольно трудоемкой. Или имеется в виду добавление записей?

PS Каков объем таблицы в мегабайтах и как она проиндексирована?

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 14:11)   письмо автору
 
   для: cheops   (04.06.2011 в 08:56)
 

Индексы добавляю один раз при проектировании БД и не собираюсь далее удалять или добавлять записи и индексы. Просто интересно почему так виснет сильно. Если одновременно добавлять индекс 2-3 столбцам, то это вообще убийство для майскула

  Ответить  
 
 автор: cheops   (04.06.2011 в 14:15)   письмо автору
 
   для: Ильдар   (04.06.2011 в 14:11)
 

Это нормально... в больших базах данных и по 2 суток эти операции проходят и не на серверах, а на таких средних суперкомпьютерах. Вам по сути нужно воссоздать таблицу базу данных (пусть и в меньших масштабах), отсортированную физически по своим полям. Чем больше объем таблицы - тем медленнее эта операция происходит.

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 14:12)   письмо автору
 
   для: 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:14)   письмо автору
 
   для: Ильдар   (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 ;

  Ответить  
 
 автор: cheops   (04.06.2011 в 14:16)   письмо автору
 
   для: Ильдар   (04.06.2011 в 14:14)
 

А каков её объем в мегабайтах?

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 14:18)   письмо автору
 
   для: cheops   (04.06.2011 в 14:16)
 

21 мб

  Ответить  
 
 автор: cheops   (04.06.2011 в 14:24)   письмо автору
 
   для: Ильдар   (04.06.2011 в 14:18)
 

Для интереса посмотрите сколько индекс места занимает?

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 14:26)   письмо автору
 
   для: cheops   (04.06.2011 в 14:24)
 

Хм.. очень интересно:

Используемое пространствоТип    Использование
Данные    10,992.3     КБ
Индекс    10,486.0     КБ
Всего    21,478.3     КБ

  Ответить  
 
 автор: cheops   (04.06.2011 в 15:00)   письмо автору
 
   для: Ильдар   (04.06.2011 в 14:26)
 

Ну за счет того, что данные в индексе отсортированы, поиск конечно будет осуществляться быстрее, чем по таблице. Однако, эффект конечно от индексов будет гораздо меньше, чем если бы их объем был раз в 10 меньше. Кроме того, такой файл индексов здорово замедлит операции удаления, вставки и обновления данных в таблице.

PS Кстати интересно, у вас числовые значения практически не индексированы, а проиндексированы строковые. Это сделано намерено?

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 15:15)   письмо автору
 
   для: cheops   (04.06.2011 в 15:00)
 

да, сделано намеренно, потому что в запросах участвуют тлько первые 6 стоблцов

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 15:18)   письмо автору
 
   для: Ильдар   (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

  Ответить  
 
 автор: cheops   (04.06.2011 в 15:31)   письмо автору
 
   для: Ильдар   (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

  Ответить  
 
 автор: cheops   (04.06.2011 в 15:32)   письмо автору
 
   для: Ильдар   (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

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 15:59)   письмо автору
 
   для: cheops   (04.06.2011 в 15:32)
 

Ты наверное имел ввиду EXPLAIN, понял, проверю ща

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 16:10)   письмо автору
 
   для: Ильдар   (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     

  Ответить  
 
 автор: cheops   (04.06.2011 в 17:14)   письмо автору
 
   для: Ильдар   (04.06.2011 в 16:10)
 

Ну вроде все впорядке ключи используются. Сколько времени запрос выполняется и где (сервер, локальная машина)?

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 18:14)   письмо автору
 
   для: cheops   (04.06.2011 в 17:14)
 

локальна машина. Но запрос этот выполняется неопределенное время. Просто виснет и все

  Ответить  
 
 автор: cheops   (04.06.2011 в 18:18)   письмо автору
 
   для: Ильдар   (04.06.2011 в 18:14)
 

Это нормально. Во-первых у локальных машин очень слабая подсистема ввода-вывода, даже на самых простецких серверах она обычно значительно сильнее. Во-вторых у вас наверняка не очень сильно настроен MySQL и не "разогрет", так как у вас нет большого количества обращений и вы не можете заполнить кэши, даже если они настроены. Работать с большой базой локально - это действительно морока (многие операции протекают слишком долго).

  Ответить  
 
 автор: Ильдар   (04.06.2011 в 19:45)   письмо автору
 
   для: cheops   (04.06.2011 в 18:18)
 

действительно на хостинге запросы сработал в разы быстрей и без повисонов.
и я знаю почему у меня виснет комп. потому что результат запроса выводит 8 млн записей. Вот поэтому и проблема. А запрос выполняется нормально 0.0169 сек.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования