MySQL ускорение работы

finista

Client
Регистрация
10.10.2012
Сообщения
361
Благодарностей
57
Баллы
28
Есть таблица 5,5 млн. строк, 12 столбцов.
Регуляркой ищу совпадение по домену в одном столбце..

На запрос уходит 25-30 сек., что не реально долго.

Вопрос. Как ускорить работу?

Варианты:
- увеличить оперативки на сервере (сейчас 1GB);
- разбить базу на отдельные таблицы и искать совпадение, а потом по ID смотреть другие параметры;
- не правильно составил SQL запрос (сейчас простой слект и условие по регулярке)
- другие варианты

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

Спасибо
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Оперативки явно мало. В идеале всю базу в кешь класть. SSD надеюсь ? Создать индексы. Если оперативка позволит они лягут в оперативку. Это существенно ускорит выборки.
Таблицы в inodb ?
 
  • Спасибо
Реакции: finista

finista

Client
Регистрация
10.10.2012
Сообщения
361
Благодарностей
57
Баллы
28
Тип базы inodb. Диск SSD.

По оперативке понял. На перспективу база будет 50GB - на первый взгляд дорого если вопрос решать оперативной.

Вопрос по индексам остался, сейчас есть Autoindex - или нужны еще какие индексы использовать?

Спасибо
 

kagorec

Client
Регистрация
24.08.2013
Сообщения
921
Благодарностей
473
Баллы
63
  • Спасибо
Реакции: finista

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
первое
по дефолту mysql встает с конфигом для mysam, innodb на нем еле шевелится
если в дебри не лезть - этого хватит

по индексу без регулярки никак?
индексацию по регуляркам mysql не поддерживает
upd:
1г оперативки - ни о чем
структуру таблицы сбрось, видно будет что сделать можно
индекс по id никак не относится к твоему запросу
 
Последнее редактирование:
  • Спасибо
Реакции: finista

backoff

Client
Регистрация
20.04.2015
Сообщения
5 925
Благодарностей
6 389
Баллы
113
  • Спасибо
Реакции: finista

Gfoblin

Client
Регистрация
30.05.2013
Сообщения
4 515
Благодарностей
990
Баллы
113
Оперативку и конфиг под inno - всё что в выборках должно быть индексировано - сразу ускоряет в 1000 раз )
Приведи пример своего запроса ты ищешь как where domain='blabla.com'; или where domain like '%blabla.com%';
 
  • Спасибо
Реакции: finista

finista

Client
Регистрация
10.10.2012
Сообщения
361
Благодарностей
57
Баллы
28
Проиндексировал по колонке email, решил на ней тренироваться

SELECT *
FROM `ym2020`
WHERE `email`
REGEXP '@vseinstrumenti.ru'
LIMIT 0 , 30

Отображает строки 0 - 29 ( 649 всего, запрос занял 2.0218 сек.)

SELECT *
FROM `ym2020`
WHERE `email` LIKE '[email protected]'
LIMIT 0 , 30

Отображает строки 0 - 29 ( 30 всего, запрос занял 0.0071 сек.)

Чуть позже настрою mysql для innodb и что-то должно получиться

Выводы:
- при формировании структуры базы лучше не использовать данные которые потом регуляркой искать
- по возможности базу разбить на несколько таблиц (для каждой группы данных своя таблица) и связать по ID
- настройка базы
- сервер не 1GB оперативки

Хостинг был стандартный reg.ru там 1 GB не самый лайт тариф
 
Последнее редактирование:

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
Вот тут куда интереснее тарифы на вдски и цены намного дешевле.
6 гигов и 4 ядра за 859 р. это ssd
 
  • Спасибо
Реакции: finista

ZULI

Client
Регистрация
09.09.2020
Сообщения
423
Благодарностей
165
Баллы
43
А чего мудрить, у тебе же машина на которой зена крутится есть же, постать туда виндовый мускуль
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
И да еще совет ставить не стандартную mysql, а лучше percona server (та же mysql только оптимизированная) ну или маша дб (mariadb) , тоже не плохо.
 
  • Спасибо
Реакции: djaga и finista

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
- по возможности базу разбить на несколько таблиц (для каждой группы данных своя таблица) и связать по ID
Называется - нормализация
Первое что делают когда база раком - денормализуют, т.е. обратную операцию
не майся херней - будет тормознее
SELECT *
FROM `ym2020`
WHERE `email` LIKE '[email protected]'
LIMIT 0 , 30
Правильно будет
SELECT * FROM `ym2020` WHERE `email` = '[email protected]' LIMIT 0 , 30;
LIKE это про другое и не надо захламлять
- при формировании структуры базы лучше не использовать данные которые потом регуляркой искать
выше писал - mysql НЕ поддерживает регулярки в индексах, да и без индексов ты уже увидел
 
  • Спасибо
Реакции: finista

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
вроде как на всех хостингах она и стоит стандартная, с ораклом не связываются
да и не хуже он если че
upd: Уже заговариваться начал, не на хостингах, а в дистрибутивах по дефолту
хотя на хостингах она тож
 
Последнее редактирование:
  • Спасибо
Реакции: finista

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
sudo apt install mariadb-server как бы отличается от sudo apt install mysql-server
 

luk911

Client
Регистрация
17.01.2013
Сообщения
1 542
Благодарностей
579
Баллы
113
с ораклом не связываются
да и не хуже он если че
Не понял причем здесь Оракл.
я про Percona

 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
изменить подход к структуре, отказаться от регулярок. если основная задача селективность по доменам, при невозможности разбить строку, все это дело классно реверсом делается.
[email protected]
[email protected]

разворачиваем строки, селектим сначало tld .com, отсекаем в случае с com не большую часть, но существенную. Переходим к домену, тут на корп доменах вообще будет молниеносно так как их довольно не много, ну посложнее будет со всякими gmail и другими популярными доменами. Все же уже будут более адекватные таймы по выборкам


 
  • Спасибо
Реакции: doc и finista

ZULI

Client
Регистрация
09.09.2020
Сообщения
423
Благодарностей
165
Баллы
43
sudo apt install mariadb-server как бы отличается от sudo apt install mysql-server
В последних дистрибутивах вроде как при apt install mysql-server все равно мария ставится насколько помнится.
 
  • Спасибо
Реакции: uuw

finista

Client
Регистрация
10.10.2012
Сообщения
361
Благодарностей
57
Баллы
28
изменить подход к структуре, отказаться от регулярок. если основная задача селективность по доменам, при невозможности разбить строку, все это дело классно реверсом делается.
[email protected]
[email protected]

разворачиваем строки, селектим сначало tld .com, отсекаем в случае с com не большую часть, но существенную. Переходим к домену, тут на корп доменах вообще будет молниеносно так как их довольно не много, ну посложнее будет со всякими gmail и другими популярными доменами. Все же уже будут более адекватные таймы по выборкам


спасибо - ведь действительно )
 

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
Не понял причем здесь Оракл.
да как бы стандартный mysql принадлежит и разрабатывается ораклом
потому от него все и стараются держаться подальше
не потому что он плох (он хорош), потому что оракл пи..р..ская компания
 

Hartwell

Client
Регистрация
25.09.2014
Сообщения
194
Благодарностей
117
Баллы
43
да как бы стандартный mysql принадлежит и разрабатывается ораклом
потому от него все и стараются держаться подальше
не потому что он плох (он хорош), потому что оракл пи..р..ская компания
наверно дело просто в лицензии? а не в безобразном ответе..
продукты mysql попдают под лицензию, что затрудняет в поставке решений связанных с mysql. пользоваться то можно, но использовать в целях дистрибуции уже нельзя. В отличии от mariadb, которую можно свобдно распростронять в том числе и в рамках компонента своего продукта.
 
  • Спасибо
Реакции: djaga

uuw

Client
Регистрация
04.06.2020
Сообщения
146
Благодарностей
54
Баллы
28
можно и так сказать - суть не меняется
 
  • Спасибо
Реакции: Hartwell

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)