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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация БД 
:(
    Опции темы
Теги: нет
Fubu_By
Дата 5.2.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Друзей: 0; Групп: 0
Регистрация: 14.2.2007

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



Добрый день.
Как сделать лучше? Два варианта: 
1) создать одну таблицу с 500тыс записей
2)разбить таблицу на ~300 небольших таблиц, каждая таблица отдельная категория будит

Если делать делать вторым способом то надо будит сделать на один запрос больше(чтобы узнать нужную категорию). Для получения нужных данных во втором варианте таблицы соединять не нужно будит

Это сообщение отредактировал(а) Fubu_By - 5.2.2010, 16:34


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Akina
Дата 5.2.2010, 16:26 (ссылка) |    (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 14481
Друзей: 0; Групп: 0
Регистрация: 8.4.2004
Где: Зеленоград, Москв а, Россия

Репутация: 45
Всего: 273



Цитата(Fubu_By @  5.2.2010,  17:17 Найти цитируемый пост)
Два варианта

Один вариант. Первый. Без вариантов.  smile 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.
PM MAIL WWW ICQ Jabber   Вверх
Fubu_By
Дата 5.2.2010, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Друзей: 0; Групп: 0
Регистрация: 14.2.2007

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



Цитата(Akina @ 5.2.2010,  16:26)
Цитата(Fubu_By @  5.2.2010,  17:17 Найти цитируемый пост)
Два варианта

Один вариант. Первый. Без вариантов.  smile

аргументируете?


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
azesmcar
Дата 5.2.2010, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспорт
****


Профиль
Группа: Участник Клуба
Сообщений: 4991
Друзей: 0; Групп: 1
Регистрация: 12.11.2004
Где: г. Ереван, Армени я

Репутация: 6
Всего: 141



Цитата(Fubu_By @  5.2.2010,  16:34 Найти цитируемый пост)
аргументируете? 

500 тысяч записей это фигня полная, о чем тут думать вообще? Поиск по нормально спроектированной таблице будет идти со скоростью света. Второй вариант это не вариант а недоразумение.

Это сообщение отредактировал(а) azesmcar - 5.2.2010, 16:38


--------------------
PM WWW   Вверх
Zloxa
Дата 5.2.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***


Профиль
Группа: Завсегдатай
Сообщений: 1573
Друзей: 0; Групп: 0
Регистрация: 12.9.2008
Где: СССР ☭

Репутация: 14
Всего: 71



Отобраться по одной из 300  категорий, получится  ~0,3% от всего набора.
Это достаточно низкая селективность, чтобы отбор по индексу был эффективен.
Абсолютно не ясно чем вызваны ваши тревоги

Это сообщение отредактировал(а) Zloxa - 5.2.2010, 16:50


--------------------
Я не живу, я слежу за собственной жизни развитием.(с) Васильев
PM MAIL   Вверх
Fubu_By
Дата 5.2.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Друзей: 0; Групп: 0
Регистрация: 14.2.2007

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



тревога вызвана тем что портал уже тормазит неплохо, при тестировании(а расчитаннывается посещаемость несколько десятков тысяч в сутки),  и без таких запросов если кэшировать, выбори идут из объединения таблиц по 200тыс с несколькими тысячами, вот и пытаюсь по чуть чуть каждый запрос сделать оптимизированным, это 


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
solenko
Дата 5.2.2010, 17:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Друзей: 0; Групп: 3
Регистрация: 15.1.2006
Где: Украина

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



если есть реальная структура и реальный запрос, то почему здесь нет ни того ни другого, а лишь абстрактный и потому лишенный смысла вопрос? )


--------------------
Все, что не анархия -- то фашизм.
PM MAIL WWW ICQ Skype   Вверх
azesmcar
Дата 5.2.2010, 17:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспорт
****


Профиль
Группа: Участник Клуба
Сообщений: 4991
Друзей: 0; Групп: 1
Регистрация: 12.11.2004
Где: г. Ереван, Армени я

Репутация: 6
Всего: 141



Цитата(Fubu_By @  5.2.2010,  17:10 Найти цитируемый пост)
тревога вызвана тем что портал уже тормазит неплохо, при тестировании(а расчитаннывается посещаемость несколько десятков тысяч в сутки),  и без таких запросов если кэшировать, выбори идут из объединения таблиц по 200тыс с несколькими тысячами, вот и пытаюсь по чуть чуть каждый запрос сделать оптимизированным, это  

Не там ошибку ищешь, покажи структуру таблиц (с индексами) и запрос который тормозит.

Это сообщение отредактировал(а) azesmcar - 5.2.2010, 17:14


--------------------
PM WWW   Вверх
solenko
Дата 5.2.2010, 17:15 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Друзей: 0; Групп: 3
Регистрация: 15.1.2006
Где: Украина

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



// на всякий случай
explain этого запроса тоже добавьте


--------------------
Все, что не анархия -- то фашизм.
PM MAIL WWW ICQ Skype   Вверх
Zloxa
Дата 5.2.2010, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***


Профиль
Группа: Завсегдатай
Сообщений: 1573
Друзей: 0; Групп: 0
Регистрация: 12.9.2008
Где: СССР ☭

Репутация: 14
Всего: 71



Цитата(solenko @  5.2.2010,  17:15 Найти цитируемый пост)
//

Код

--

или же
Код

/*   */

на крайняк - 
Код

#

это ведь не PHP!  smile 
сорри за офттоп.. не удержался.




--------------------
Я не живу, я слежу за собственной жизни развитием.(с) Васильев
PM MAIL   Вверх
Fubu_By
Дата 9.2.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Друзей: 0; Групп: 0
Регистрация: 14.2.2007

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



Это самый трудо затратный по выполнению запрос у меня
Код

CREATE TABLE IF NOT EXISTS `categories` (
  `id` bigint(20) NOT NULL,
  `name` varchar(100) collate utf8_bin NOT NULL,
  `parent` bigint(20) NOT NULL,
  `prefix` varchar(100) collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; #328 записей


CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL,
  `name` varchar(222) collate utf8_bin NOT NULL,
  `short_desc` text collate utf8_bin,
  `price` float NOT NULL,
  `prefix` varchar(222) collate utf8_bin NOT NULL,
  `brand_id` int(11) NOT NULL default '0',
  `description` text collate utf8_bin,
  `rating` decimal(10,0) default '0',
  `count_load` mediumint(9) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; # 172,996  записи

SELECT 
                c.id,
                c.name,
                c.`prefix`,
                COUNT(p.id) AS `product_count`
            FROM `categories` AS c
            LEFT JOIN `products` AS p ON (c.`prefix`=p.`prefix`)
            GROUP BY c.`name`
            ORDER BY c.`name`'


а это запрос который я хочу разбить, таблицу offers разбить на пару сотен небольших таблиц которые буду подключатся в селект в зависимости от prefix
Код

CREATE TABLE IF NOT EXISTS `offers` (
  `id` mediumint(9) NOT NULL auto_increment,
  `product_id` int(11) NOT NULL,
  `product_name` varchar(200) collate utf8_bin NOT NULL,
  `product_description` text collate utf8_bin,
  `product_base_price` float NOT NULL default '0',
  `product_shipping_cost` float NOT NULL default '0',
  `offer_id` varchar(100) collate utf8_bin NOT NULL,
  `offer_url` text collate utf8_bin NOT NULL,
  `offer_logo_url` text collate utf8_bin NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `offer_id` (`offer_id`),
  KEY `product_id` (`product_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=272948 ; # 273,688 записей (пока что, планируется 500т и больше)

CREATE TABLE IF NOT EXISTS `products` (
  `id` int(11) NOT NULL,
  `name` varchar(222) collate utf8_bin NOT NULL,
  `short_desc` text collate utf8_bin,
  `price` float NOT NULL,
  `prefix` varchar(222) collate utf8_bin NOT NULL,
  `brand_id` int(11) NOT NULL default '0',
  `description` text collate utf8_bin,
  `rating` decimal(10,0) default '0',
  `count_load` mediumint(9) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; # 172,996  записи


SELECT 
                0 AS `shop_id`, 
                'shop.name' `as shop_name`, 
                p.`id` as `product_id`, 
                p.`prefix` as `prefix`, 
                o.`product_name` AS `title`, 
                o.`product_base_price` AS `price`,
                o.`product_description` AS `description`,
                o.`product_shipping_cost` AS `shipping_cost`, 
                o.`offer_url` AS `ProductURL`,
                o.`offer_logo_url` as `offer_logo_url` 
            FROM `offers` AS o 
            LEFT JOIN products p ON (o.product_id=p.id) 
            WHERE o.product_id='321' 
            ORDER BY p.price ASC



Это сообщение отредактировал(а) Fubu_By - 9.2.2010, 12:52


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Zloxa
Дата 9.2.2010, 14:26 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***


Профиль
Группа: Завсегдатай
Сообщений: 1573
Друзей: 0; Групп: 0
Регистрация: 12.9.2008
Где: СССР ☭

Репутация: 14
Всего: 71



Цитата(Fubu_By @  9.2.2010,  12:51 Найти цитируемый пост)
а это запрос который я хочу разбить, таблицу offers разбить на пару сотен небольших таблиц которые буду подключатся в селект в зависимости от prefix

Сущность offers не характеризуется атрибутом prefix. Этот атрибут характеризует сущность products. Если вы денормализуете таблицу offers, наделите ее атрибутом prefix, чего вы добъетесь? Отбор из этой таблице вы производите по id_product, который индексирован. Рассував данные из этой таблицы по признаку prefix в разные таблицы, вы ни в коем случае не уменьшите количество чтений потому что вы и так для доступа используете индекс.(должны, по идее, вы не привели плана)

Единственное преимущество от этой иновации, которое я могу высосать из пальца - если вы файлы каждой из таблиц разместите на разных физических дисках, возможно вы сможете избежать ожиданий на дисковых чтениях двух конкурентных сессий, выбирающихся по продуктам с разными префиксами. Но тут же вы соединяетесь с таблицей products, доступ к которой сведет весь бенефит на нет. Если только и products разобрать на табличи и раскидать по дискам, как и offers. 


Цитата(Fubu_By @  9.2.2010,  12:51 Найти цитируемый пост)
Это самый трудо затратный по выполнению запрос у меня

Вопрос не Вам, но знающим:
Я слышал индексы MyISAM хранят количество уникальных значений в нем. Хрянят ли они количество записей, соответствующих каждому значению?

Если это так, возможно имело бы смысл построить индекс по product.prefix, чтобы можно было бы использовать инфомрацию о количестве из это индекса.

Если это не так(что наверняка), имело бы смысл сделать сбоку табличку которая содержала бы количество продуктов по категории, вести эту табличку из триггеров на продукты и запросы делать к ней а не к табилце продуктов. Благо вы все равно используете MyISAM , вам нечего боятся избытка блокировок по модификации.

Это сообщение отредактировал(а) Zloxa - 9.2.2010, 17:27


--------------------
Я не живу, я слежу за собственной жизни развитием.(с) Васильев
PM MAIL   Вверх
Fubu_By
Дата 10.2.2010, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 250
Друзей: 0; Групп: 0
Регистрация: 14.2.2007

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



ок теперь понял, что разбивать смысла большого нету

Добавлено через 39 секунд
а как оптимизировать можно первый запрос чтобы выполнялся быстрее?


--------------------
<удалено администрацией форума>
PM MAIL   Вверх
Fortop
Дата 10.2.2010, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1423
Друзей: 0; Групп: 2
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 29



Цитата(Fubu_By @  10.2.2010,  11:36 Найти цитируемый пост)
а как оптимизировать можно первый запрос чтобы выполнялся быстрее? 

Цитата(solenko @  5.2.2010,  16:15 Найти цитируемый пост)
explain этого запроса тоже добавьте 

Цитата(Zloxa @  9.2.2010,  13:26 Найти цитируемый пост)
вы не привели плана)

Fubu_By
Поэтому даже сказать нечего.




--------------------
Мир это Я.
Живее всех живых.
PM MAIL WWW ICQ   Вверх
Zloxa
Дата 10.2.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
***


Профиль
Группа: Завсегдатай
Сообщений: 1573
Друзей: 0; Групп: 0
Регистрация: 12.9.2008
Где: СССР ☭

Репутация: 14
Всего: 71



Fortop, зачем тебе план первого запроса? Там и так видно что фулсканы неизбежны. 
Fubu_By, чем не устроило мое предложение со вспомогательной таблицей? Было ли произведено исследование на предмет наличия в индексе информации о количестве строк? Имеет ли смысл Вам отвечать в дальнейшем, если Вы не пытаетесь воспринять ответы?


--------------------
Я не живу, я слежу за собственной жизни развитием.(с) Васильев
PM MAIL   Вверх
Google
  Дата 9.9.2010, 17:29 (ссылка)  





  Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 


Rambler's Top100

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


Реклама на сайте

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