- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Что делать, если ваша email-рассылка попала в спам
10 распространенных причин и решений
Екатерина Ткаченко
В 2023 году 36,9% всех DDoS-атак пришлось на сферу финансов
А 24,9% – на сегмент электронной коммерции
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Если char 32 почему 96? реально нужны ключи в mb-кодировке?..
Не нужны, вчера уже исправил, быстрее не стало.
key_buffer_size что показывает?
Глобальный 16777216
Но я уже сделал отдельный CACHE INDEX на эту таблицу:
SET GLOBAL the_cache.key_buffer_size = 2000000 * 32
CACHE INDEX the_table IN the_cache
И тоже не помогло.
Для слагов лучше использовать varchar, а еще лучше varbinary.
А еще лучше для больших объемов использовать числовые id, если у вас не социалка какая-нибудь (с поддержкой коротких адресов).
Вот честно не понимаю, почему хвалят Postgre? Во многих случаях, когда у меня были проблемы с быстродействием, я тестировал Maria, Postgre и Mongo, и всегда быстрее всего оказывались или Maria или Mongo но никогда Postgre.
За функционал. Иннодб по скорости зачастую майисам проигрывает, но функциональнее. Оракл на бытовом оборудовании тормозит просто адски по сравнению с мускулом, но функционал решает.
Но я уже сделал отдельный CACHE INDEX на эту таблицу:
SET GLOBAL the_cache.key_buffer_size = 2000000 * 32
CACHE INDEX the_table IN the_cache
И тоже не помогло.
Так то кэш-индекс. Да, индекс у Вас возьмется из памяти, но потом-то надо добыть данные с диска. А это - еще раз 0.004 секунды в лучшем случае на позиционирование, т.е. из кэша индекса Вы берете данные о том, где лежит нужная строка на диске, потом он 0.004 секунды туда позицинируется в лучшем случае, считывает. А если несколько данных в разных местах (выборка в начале таблицы и в конце допустим), то учитывая размер таблицы в 3.5гб - будет несколько позиционирований.
Если надо ускорять - у Вас вариант а) сменить на ссд б) засунуть всё в память.
Вот честно не понимаю, почему хвалят Postgre? Во многих случаях, когда у меня были проблемы с быстродействием, я тестировал Maria, Postgre и Mongo, и всегда быстрее всего оказывались или Maria или Mongo но никогда Postgre.
PostgreSQL почти всегда быстрее. Просто его нужно уметь готовить.
Для слагов лучше использовать varchar, а еще лучше varbinary.
Я не думаю что там просто так char(32), скорее всего md5 хранят.
Solmyr, если данные в таблицы выбираются только по ключу (т.е. нет range запросов), можете вынести все в Redis. В InnoDB для PK иногда используются adaptive hash index. Чем обусловлен выбор таблицы MyISAM?
А вообще, сделайте пожалуйста
и ещё вот это через CLI
Вангую что больше всего времени уходит на sending data, но тем не менее.
У поля какая кодировка стоит? Может попробовать сделать CHARACTER SET 'ascii' COLLATE 'ascii_bin'?
Я не думаю что там просто так char(32), скорее всего md5 хранят.
Там де-факто только циферки, но trailing zero имеют значения, то есть 00234 и 000234 это два разных айдишника. Потому тип данных сделан ascii_bin. Длина действительно может быть разной, от 5 до 32 цифер, но я не понимаю чем varchar в этом случае лучше чем char(32)
---------- Добавлено 28.03.2020 в 14:16 ----------
если данные в таблицы выбираются только по ключу (т.е. нет range запросов), можете вынести все в Redis
Не хочется плодить зоопарк сервисов. И так уже есть Maria, Postgre и Mongo, только редиса не хватает...
---------- Добавлено 28.03.2020 в 14:20 ----------
Вангую что больше всего времени уходит на sending data, но тем не менее.
MariaDB [odnodata]> SHOW PROFILE FOR QUERY 1;
+--------------------------------+----------+
| Status | Duration |
+--------------------------------+----------+
| starting | 0.000021 |
| Waiting for query cache lock | 0.000007 |
| init | 0.000005 |
| checking query cache for query | 0.000032 |
| checking permissions | 0.000007 |
| Opening tables | 0.000016 |
| After opening tables | 0.000006 |
| System lock | 0.000006 |
| Table lock | 0.000007 |
| Waiting for query cache lock | 0.000029 |
| init | 0.000038 |
| optimizing | 0.000020 |
| statistics | 0.019021 |
| preparing | 0.000011 |
| Unlocking tables | 0.000018 |
| executing | 0.000006 |
| Sending data | 0.000033 |
| end | 0.000006 |
| query end | 0.000019 |
| closing tables | 0.000025 |
| Unlocking tables | 0.000010 |
| freeing items | 0.000009 |
| updating status | 0.000006 |
| Waiting for query cache lock | 0.000004 |
| updating status | 0.000021 |
| Waiting for query cache lock | 0.000005 |
| updating status | 0.000004 |
| storing result in query cache | 0.000029 |
| cleaning up | 0.000005 |
+--------------------------------+----------+
На одном запросе по-моему ничего видно не будет, это статистику на 1000 надо собирать.
---------- Добавлено 28.03.2020 в 14:25 ----------
А вообще, сделайте пожалуйста
{
"query_block": {
"select_id": 1,
"table": {
"table_name": "the_table",
"access_type": "const",
"possible_keys": ["PRIMARY"],
"key": "PRIMARY",
"key_length": "32",
"used_key_parts": ["id"],
"ref": ["const"],
"rows": 1,
"filtered": 100
}
}
Там де-факто только циферки, но trailing zero имеют значения, то есть 00234 и 000234 это два разных айдишника.
Это не trailing zero, это ведущие нули
Длина действительно может быть разной, от 5 до 32 цифер, но я не понимаю чем varchar в этом случае лучше чем char(32)
В общем я уже решил. Полную структуру буду хранить в Монго, а для решения изначальной проблемы сделаю отдельную таблицу из id, value и буду ее хранить в MariaDB в таблице типа Memory.
но я не понимаю чем varchar в этом случае лучше чем char(32)
длина будет n байт + 1, а не 32 байта.
statistics | 0.019021 |
На одном запросе по-моему ничего видно не будет, это статистику на 1000 надо собирать.
Нет, достаточно одного запроса, но чтобы планировщик имел статистику по запросам. Т.е., желательно дать рабочую нагрузку на таблицу, а потом профайлинг.
Попробуйте ANALYZE TABLE; сделать, если это не прод, можно так-же попробовать OPTIMIZE TABLE сделать. У вас mysql больше думает над тем, как выполнить запрос, чем над выборкой самих данных. Насколько критично наличие констрейнта на уникальность? Если в вашем стеке уже есть PostgreSQL, и версия 10 или выше, можете попробовать сделать таблицу с полем TEXT, но вместо PRIMARY KEY сделать так:
Но тогда не будет уникального констрейнта (возможно появление дублей, если будете просто делать INSERT).
Хеш индексы чуть быстрее будут (должно быть O(1) вместо O(logn), но не уверен что в pg честная константа).
---------- Добавлено 28.03.2020 в 12:33 ----------
а для решения изначальной проблемы сделаю отдельную таблицу из id, value и буду ее хранить в MariaDB в таблице типа Memory.
Memory это ещё более жалкое поделие, чем MyISAM :)
хранить в MariaDB в таблице типа Memory.
Вполне рабочее решение.. если памяти достаточно и остальные данные не нужны .
+ не забывать обновлять при добавлении и заполнять, если она по какой-то причине "опустела".. :D