Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Сложилась ситуация при которой нужные мне запросы к бд (mysql), выполняются очень долго.
Структуру бд изменять не вариант.
Перейду от слов к примерам:
Существует бд, в ней хронятся записи (посещёний пользователей), система контроля придприятия.
Таблицы создаются каждый день, т.е table0304,table0404,.......tableNM
Сейчас для отладки системы в базе 3 000 000 записей, но по сути будет и больше.
в них записываются данный по посещения пользователя интрнет ресурсов.
Задача:
Сделать запросы ко всем таблицам поиска, допустим, какого нибудь домена, или маску домена и показывать все совподения в которых встречается нужный домен (или маска).
Потом по каждому совподению надо показывать пользоватлей, у которых оно всречаться.
Это можно реализовывать сделав сначало запрос выборки совподений доменов по каждой таблице (можно объеденить запрос ко всем таблицам в один), потом по этим доменаи искать пользователей по всем таблицам и т.д.
Перевробывал много вариантов, но не получил нужной производительности.
Подскажите как лутше осуществлять поиск к большим базам данных(в частности для выполненеия моей задачи), может произвести какие настройки mysql сервера (дела не в загружености сервера, он не загружается. а дело во времени получения нужного результата).
Заранее Блогодарен за Ваши ответы.
Отредактированно dev0 (07.04.2011 16:36:19)
Неактивен
Приведите, пожалуйста, структуру одной из табличек, запрос и EXPLAIN
от этого запроса
Неактивен
paulus написал:
Приведите, пожалуйста, структуру одной из табличек, запрос и EXPLAIN
от этого запроса
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 делать первым надо, что бы убрать повторения и не делать лишних запросов.
Неактивен
paulus написал:
Приведите, пожалуйста, структуру одной из табличек, запрос и EXPLAIN
от этого запроса
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)
Неактивен
А ключик на (url, user) есть? Кажется, то, что Вы делаете, решается запросом
SELECT GROUP_CONCAT(user), url FROM tablename GROUP BY 2
Но работать нормально он будет только при наличии индекса. Ну и надо понимать,
что Ваш запрос с LIKE работать нормально не будет никогда, т.к. такой LIKE не смо-
жет использовать никакой индекс.
Неактивен
Спасибо за виши ответы!
Подскажите ещё один момент, если я сделаю ALTER TABLE `tableNM` ADD FULLTEXT (`user`,`url`), для каждей таблице.
И потом сделаю объединение в таблицу типа MRG_MyISAM. индексация будеть иметь значение в объеденёной таблице?
Отредактированно dev0 (09.04.2011 18:04:47)
Неактивен
Если Вы будете искать через MATCH, то да, индекс должен использоваться.
Неактивен
Но в случае индексов на MyISAM-табличках, которые объединены в MRG_MyISAM индекс будет использоваться не вполне так, как ожидается. Посмотрите таблица типа MRG_MYISAM vs большая таблица типа myisam
Отредактированно deadka (11.04.2011 00:25:35)
Неактивен
Здравствуйте.
Подскажите, какое должно быть значени поля 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)
Неактивен
Cardinality для полнотекстовых индексов не считается, т.к. не имеет смысла.
Быстрее ли sphinx — не известно, смотря для каких задач В смысле — надо
взять и попробовать.
Неактивен