SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.04.2011 16:34:43

dev0
Участник
Зарегистрирован: 07.04.2011
Сообщений: 5

помогите оптимизировать!!

Здравствуйте!

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

Перейду от слов к примерам:

Существует бд, в ней хронятся записи (посещёний пользователей), система контроля придприятия.

Таблицы создаются каждый день, т.е table0304,table0404,.......tableNM
Сейчас для отладки системы в базе 3 000 000 записей, но по сути будет и больше.

в них записываются данный по посещения пользователя интрнет ресурсов.

Задача:

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

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

Это можно реализовывать сделав сначало запрос выборки совподений доменов по каждой таблице (можно объеденить запрос ко всем таблицам в один), потом по этим доменаи искать пользователей по всем таблицам и т.д.

Перевробывал много вариантов, но не получил нужной производительности.

Подскажите как лутше осуществлять поиск к большим базам данных(в частности для выполненеия моей задачи), может произвести какие настройки mysql сервера (дела не в загружености сервера, он не загружается. а дело во времени получения нужного результата).

Заранее Блогодарен за Ваши ответы.

Отредактированно dev0 (07.04.2011 16:36:19)

Неактивен

 

#2 08.04.2011 21:53:14

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: помогите оптимизировать!!

Приведите, пожалуйста, структуру одной из табличек, запрос и EXPLAIN
от этого запроса smile

Неактивен

 

#3 09.04.2011 01:22:38

dev0
Участник
Зарегистрирован: 07.04.2011
Сообщений: 5

Re: помогите оптимизировать!!

paulus написал:

Приведите, пожалуйста, структуру одной из табличек, запрос и EXPLAIN
от этого запроса smile

tableNM, где N - это день,M - месяц

структура `id` bigint(20) unsigned NOT NULL auto_increment PRIMARY KEY, `user` varchar(40) NOT NULL, `url` varchar(2112) NOT NULL

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

сначало выбераю url - SELECT url FROM tableNM WHERE url LIKE '%DOMAIN%';  DOMAIN - тут можеть быть домен google.com, может быть google*.

этим получаюе список всех URL которые попадают под мою маску.

Потом исходня из этого списка делаю запросы по поиску пользователей у которых встречается тот или иной URL.
Запросы тоже делаю к каждой таблице
SELECT user FROM tableNM WHERE url = '$url'; $url - это элемента списка полученого в предыдущем запросе

вывод будет иметь вот такой вид

URL1
USER1,USER2,...,USERN

URL2
USER23,USER45,....,USERN

......

URLN
USER12,USER67,....,USERN


так же пробывал объеденять все таблицы в одну типа MRG_MyISAM, и делать один запрос.но только выбора всех URL занимает чуть менше 9 минут. а выбор URL делать первым надо, что бы убрать повторения и не делать лишних запросов.

Неактивен

 

#4 09.04.2011 01:38:43

dev0
Участник
Зарегистрирован: 07.04.2011
Сообщений: 5

Re: помогите оптимизировать!!

paulus написал:

Приведите, пожалуйста, структуру одной из табличек, запрос и EXPLAIN
от этого запроса smile

SELECT url
FROM total
WHERE url LIKE '%google.com%';

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    SIMPLE     total      ALL     NULL    NULL    NULL    NULL    3525261    Using where

это запрос к объеденённой таблице

Отредактированно dev0 (09.04.2011 01:53:57)

Неактивен

 

#5 09.04.2011 14:30:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: помогите оптимизировать!!

А ключик на (url, user) есть? Кажется, то, что Вы делаете, решается запросом
SELECT GROUP_CONCAT(user), url FROM tablename GROUP BY 2
Но работать нормально он будет только при наличии индекса. Ну и надо понимать,
что Ваш запрос с LIKE работать нормально не будет никогда, т.к. такой LIKE не смо-
жет использовать никакой индекс.

Неактивен

 

#6 09.04.2011 18:04:14

dev0
Участник
Зарегистрирован: 07.04.2011
Сообщений: 5

Re: помогите оптимизировать!!

Спасибо за виши ответы!

Подскажите ещё один момент, если я сделаю ALTER TABLE `tableNM` ADD FULLTEXT (`user`,`url`), для каждей таблице.
И потом сделаю объединение в таблицу типа MRG_MyISAM. индексация будеть иметь значение в объеденёной таблице?

Отредактированно dev0 (09.04.2011 18:04:47)

Неактивен

 

#7 11.04.2011 00:17:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: помогите оптимизировать!!

Если Вы будете искать через MATCH, то да, индекс должен использоваться.

Неактивен

 

#8 11.04.2011 00:24:57

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: помогите оптимизировать!!

Но в случае индексов на MyISAM-табличках, которые объединены в MRG_MyISAM индекс будет использоваться не вполне так, как ожидается. Посмотрите таблица типа MRG_MYISAM vs большая таблица типа myisam

Отредактированно deadka (11.04.2011 00:25:35)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#9 19.04.2011 18:24:18

dev0
Участник
Зарегистрирован: 07.04.2011
Сообщений: 5

Re: помогите оптимизировать!!

Здравствуйте.

Подскажите, какое должно быть значени поля Cardinality индекса FULLTEXT. когда делаешь запрос

ALTER TABLE `tableNM` ADD FULLTEXT (`user`); это значени принимает 1. но когда я просто дописал в скрипт, что бы по шаблону содовалась новая таблица

CREATE TABLE IF NOT EXISTS `tableNM` (
`id` bigint(20) unsigned NOT NULL auto_increment,
`user` varchar(40) NOT NULL,
`url` varchar(2112) NOT NULL,
PRIMARY KEY  (`id`), FULLTEXT (`user`), FULLTEXT (`url`)
) ENGINE=MyISAM ;

тогда это поле принимает значение NULL (проверяю командой SHOW INDEX FROM tableNM). так должно быть или я что то делаю не правильно?


И ещё если использывать движок sphinx, для этих целей. будет быстрее проходить поиск?

Отредактированно dev0 (19.04.2011 18:29:44)

Неактивен

 

#10 20.04.2011 21:19:46

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: помогите оптимизировать!!

Cardinality для полнотекстовых индексов не считается, т.к. не имеет смысла.

Быстрее ли sphinx — не известно, смотря для каких задач smile В смысле — надо
взять и попробовать.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson