Список вопросов
Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Работа с MyISAM таблицей с кол-вом записей от 10'000'000?
Просмотров: 292
 
Ответов: 6
Есть таблица, где хранятся записи о товарах, всего товарах около 10'000'000 — количество может вырасти до 20'000'000.
Вывод работает нормально, но заказчик хочет еще админку к этой базе для анализа товаров, поставщиков и прочего — это будет выглядеть как фильтры для каждого поля бд.
Запрос на создание таблицы:
CREATE TABLE `suppliers_store` (<br/>
`id_suppliers_store` int(11) NOT NULL AUTO_INCREMENT,<br/>
`id_suppliers` int(11) NOT NULL,<br/>
`dt` date NOT NULL,<br/>
`name` varchar(255) NOT NULL,<br/>
`code` varchar(255) NOT NULL,<br/>
`price` double NOT NULL,<br/>
`code_suppliers` varchar(255) NOT NULL,<br/>
`count` int(11) NOT NULL DEFAULT '0',<br/>
`producer` varchar(255) NOT NULL,<br/>
`weight` varchar(255) NOT NULL,<br/>
PRIMARY KEY (`id_suppliers_store`),<br/>
KEY `NewIndex1` (`id_suppliers`),<br/>
KEY `NewIndex2` (`dt`)<br/>
) ENGINE=MyISAM DEFAULT CHARSET=utf8
Вот примерный запрос, с условиями, которые может сгенерировать фильтр:
select ss.*, s.delivery<br/>
from suppliers_store as ss<br/>
join suppliers as s on ss.id_suppliers = s.id_suppliers<br/>
where (ss.dt >= '2010-02-01 00:00:00' and ss.dt <= '2011-02-01 23:59:59') and <br/>
(ss.name like '%панель%' or ss.code like '%панель%') and<br/>
(ss.price > 1000) and<br/>
(ss.count > 0)<br/>
LIMIT 50
Собственно эти фильтры и заставляют mysql каждый раз шерстить всю базу, индексы по полям, как я понимаю, особо не помогут.
Раньше опыта работы с такими объемами не было, насколько mysql подходит для этих целей?
Как можно увеличить скорость поиска по табличке?
CREATE TABLE `suppliers_store` (<br/>
`id_suppliers_store` int(11) NOT NULL AUTO_INCREMENT,<br/>
`id_suppliers` int(11) NOT NULL,<br/>
`dt` date NOT NULL,<br/>
`name` varchar(255) NOT NULL,<br/>
`code` varchar(255) NOT NULL,<br/>
`price` double NOT NULL,<br/>
`code_suppliers` varchar(255) NOT NULL,<br/>
`count` int(11) NOT NULL DEFAULT '0',<br/>
`producer` varchar(255) NOT NULL,<br/>
`weight` varchar(255) NOT NULL,<br/>
PRIMARY KEY (`id_suppliers_store`),<br/>
KEY `NewIndex1` (`id_suppliers`),<br/>
KEY `NewIndex2` (`dt`)<br/>
) ENGINE=MyISAM DEFAULT CHARSET=utf8select ss.*, s.delivery<br/>
from suppliers_store as ss<br/>
join suppliers as s on ss.id_suppliers = s.id_suppliers<br/>
where (ss.dt >= '2010-02-01 00:00:00' and ss.dt <= '2011-02-01 23:59:59') and <br/>
(ss.name like '%панель%' or ss.code like '%панель%') and<br/>
(ss.price > 1000) and<br/>
(ss.count > 0)<br/>
LIMIT 50
1. Поля с датами и ценами — индексы (тогда должно ходить по индексам)
2. Для полей со строками — два варианта — либо не искать с % в начале (не пойдет тогда по индексу)
либо делается отдельная табличка со словами. При INSERT/UPDATE в нее пишется все слова в строках. Например insert into words (id, type, word) select suppliers_store.id, 'name', 'панель' и делается индекс (type, word, id). Соотв. поиск производится по этой табличке без испрользования %.
Подумайте может есть возможность сделать еще одну табличку с кешем, допустим текстовые поля можно разбить по пробелам и запихнуть в другую табличку со ссылками на нужную запись, хоть и строк будет больше но точное сравнение будет работать гораздо быстрей чем like как в Вас. Но тогда ограничение будет поиска четко по словам, нельзя будет искать «пане» или «челове»
Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться