powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите ускорить запрос MySQL
16 сообщений из 16, страница 1 из 1
Помогите ускорить запрос MySQL
    #38980600
vasilijj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, я абсолютный дилетант в БД, прошу помощи экспертов.

Есть таблица posts 1,5 млн. строк, общий размер с индексами 27 GiB.

Запрос выполняется в среднем 3 секунды.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
INSERT INTO cache (reference_ID,ID,score) 

(
SELECT SQL_NO_CACHE 5 as reference_ID, 
              ID, 
                 ROUND(0 + MATCH (content) AGAINST ('здесь различные слова не более восьми')) as score 

FROM posts 
WHERE ID != '5' 
 GROUP BY ID 
 HAVING score >= 2.0  
 ORDER BY score DESC LIMIT 7
) 
  ON DUPLICATE KEY UPDATE date = NOW();



Можно ли как-то оптимизировать или ускорить?

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
key_buffer		= 18G
sort_buffer		= 16M
myisam_sort_buffer_size = 12G
#read_buffer_size	= 1M
max_allowed_packet	= 256M
#max_join_size		= 1000000
max_sort_length		= 20
#thread_stack		= 192K
thread_cache_size       = 8
long_query_time		= 10
tmp_table_size		= 256M
max_heap_table_size	= 512M
join_buffer_size	= 224M



Что стоит подкрутить my.cnf?
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38980602
vasilijj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл написать, таблица MyISAM.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38980621
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilijj,

А структуру таблицы, индексы и пр. - предлагаете угадывать?
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38980622
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilijj,

И план запроса тоже давайте.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38980623
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilijj
Код: plsql
1.
GROUP BY ID

А это зачем?
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38980667
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
эта..
без групповых функций хэвинг безсполезен?
а че такое ON DUPLICATE KEY?
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38980681
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingizбез групповых функций хэвинг безсполезен?вовсе нет, можно вообще не использовать группировку и агрегатные функции и тем не менее пользоваться хэвингом (бывает ли в этом необходимость - другой вопрос)

tchingizа че такое ON DUPLICATE KEY?это типа upsert
https://dev.mysql.com/doc/refman/5.5/en/insert-on-duplicate.html
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981058
login_sqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а как вам вариант предложенной на сайте http://phpclub.ru/mysql/doc/fulltext-search.html, 3-пример? fulltext индекс сам сортирует результат по релевантности, зачем такой костыль городить с GROUP BY и ORDER BY. насколько критично в таблице cache держать строку score?

p.s присоединяюсь к Злой Бобр, miksoft.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981506
vasilijj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `posts` (
  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` text NOT NULL,
  `content` longtext NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `date` (`date`,`ID`),
  FULLTEXT KEY `title` (`title`),
  FULLTEXT KEY `content` (`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE `cache` (
  `reference_ID` bigint(20) unsigned NOT NULL DEFAULT '0',
  `ID` bigint(20) unsigned NOT NULL DEFAULT '0',
  `score` float unsigned NOT NULL DEFAULT '0',
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`reference_ID`,`ID`),
  KEY `score` (`score`),
  KEY `ID` (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8



Таблца cache используется для вывода похожих статей. Выбирается так:

Код: plsql
1.
SELECT posts.*, related.score FROM posts JOIN cache AS related ON posts.ID = related.ID WHERE related.score >= 2 AND related.reference_ID = 5 ORDER BY related.score DESC LIMIT 7



miksoftvasilijj,

И план запроса тоже давайте.
Подскажите как его получить в моём случае.

login_sqlruа как вам вариант предложенной на сайте http://phpclub.ru/mysql/doc/fulltext-search.html, 3-пример? fulltext индекс сам сортирует результат по релевантности, зачем такой костыль городить с GROUP BY и ORDER BY. насколько критично в таблице cache держать строку score?

p.s присоединяюсь к Злой Бобр, miksoft.

miksoftvasilijj
Код: plsql
1.
GROUP BY ID

А это зачем?

Я ж говорю - дилетант, сильно не ругайте, всё подсмотрено в различных местах, и собрано в стиле эникейщиков. Буду признателен, если подскажете как сделать лучше.

На данный момент собрал костыль в связке с sphinx. Уходит в среднем 0,4 сек.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981537
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilijjmiksoftпропущено...
А это зачем?Я ж говорю - дилетант, сильно не ругайте, всё подсмотрено в различных местах, и собрано в стиле эникейщиков. Буду признателен, если подскажете как сделать лучше.Если ID - это первичный ключ (что предполагается), то просто уберите эту строку из запроса.


vasilijjmiksoftvasilijj,

И план запроса тоже давайте.
Подскажите как его получить в моём случае.Выполните такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
EXPLAIN SELECT SQL_NO_CACHE 5 as reference_ID, 
              ID, 
                 ROUND(0 + MATCH (content) AGAINST ('здесь различные слова не более восьми')) as score 
FROM posts 
WHERE ID != '5' 
 HAVING score >= 2.0  
 ORDER BY score DESC LIMIT 7

Если кратко - слово EXPLAIN перед запросом не выполняет его, а строит и выдает план этого запроса.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981574
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftЕсли ID - это первичный ключ (что предполагается)Если это так - то как-то теряется смысл запроса. Да и расчёт MATCH AGAINST по 1,5кк записей за 3 секунды чёта мне сомнителен.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981603
vasilijj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftВыполните такой запрос:


+----+-------------+----------+------+---------------+------+---------+------+---------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+---------+-----------------------------+
| 1 | SIMPLE | posts | ALL | PRIMARY | NULL | NULL | NULL | 1457034 | Using where; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+---------+-----------------------------+
1 row in set (0.02 sec)


AkinamiksoftЕсли ID - это первичный ключ (что предполагается)Если это так - то как-то теряется смысл запроса. Да и расчёт MATCH AGAINST по 1,5кк записей за 3 секунды чёта мне сомнителен.

Если я правильно понимаю, то первый запрос выполняется приблизительно 2 минуты. А после него, когда индексы уже сидят в key_buffer выходит в среднем 3 секунды.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981678
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vasilijj,

Пользуйте sphinx, т.к. в мускуле полнотекстовый поиск сделан криво. Ну или делайте EAV для хранения score. Тогда все будет летать, но придется время от времени перестраивать эту таблицу.
Однозначного ответа нет. Или тратить время от раз в сутки до раз в месяц (в зависимости от потребности) для создания EAV по score, или пользовать sphinx.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981684
login_sqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilijjmiksoftВыполните такой запрос:


+----+-------------+----------+------+---------------+------+---------+------+---------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+---------+-----------------------------+
| 1 | SIMPLE | posts | ALL | PRIMARY | NULL | NULL | NULL | 1457034 | Using where; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+---------+-----------------------------+
1 row in set (0.02 sec)


Akinaпропущено...
Если это так - то как-то теряется смысл запроса. Да и расчёт MATCH AGAINST по 1,5кк записей за 3 секунды чёта мне сомнителен.

Если я правильно понимаю, то первый запрос выполняется приблизительно 2 минуты. А после него, когда индексы уже сидят в key_buffer выходит в среднем 3 секунды.
Я как dba, а не как разработчик могу сказать что индекс твой запрос не использует, думаю просто всю таблицу posts загрузил на ОЗУ.короче сервер быстрый. Про сфинкс только слышал.поэтому сейчас ничего не могу сказать.
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981708
login_sqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ещё, в таблицу cache данные записываются в reference_id=5, score>=2 limit 7. Зачем в выборке с cache-а снова использовать в where те же фильтры. По скорости мелочь, но все же...

Модератор: Тема перенесена из форума "Вопрос-Ответ".
...
Рейтинг: 0 / 0
Помогите ускорить запрос MySQL
    #38981743
vasilijj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так как с EAV никогда не сталкивался, решил немнго потестить sphinx, в сравнении с FULLTEXT поиском. При разборе результов выдачи, мне пришло в голову сравнение валика и кисточки при покраске стен. В первом случае быстро и гладко, во втором долго и с шероховатостями. Ещё раз убедился, что каждому инструменту своё предназначение.

Решил остановиться на sphinx и облагородить свой прикрученный костыль :) Огромное всем спасибо за помощь и участие.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите ускорить запрос MySQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]