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

Есть таблица 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
10.06.2015, 00:01:48
    #38980602
vasilijj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
Забыл написать, таблица MyISAM.
...
Рейтинг: 0 / 0
10.06.2015, 01:24:06
    #38980621
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
vasilijj,

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

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

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

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

p.s присоединяюсь к Злой Бобр, miksoft.
...
Рейтинг: 0 / 0
10.06.2015, 18:22:30
    #38981506
vasilijj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
Код: 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
10.06.2015, 18:52:27
    #38981537
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
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
10.06.2015, 19:27:36
    #38981574
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
miksoftЕсли ID - это первичный ключ (что предполагается)Если это так - то как-то теряется смысл запроса. Да и расчёт MATCH AGAINST по 1,5кк записей за 3 секунды чёта мне сомнителен.
...
Рейтинг: 0 / 0
10.06.2015, 20:10:13
    #38981603
vasilijj
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
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
10.06.2015, 22:19:36
    #38981678
Злой Бобр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
vasilijj,

Пользуйте sphinx, т.к. в мускуле полнотекстовый поиск сделан криво. Ну или делайте EAV для хранения score. Тогда все будет летать, но придется время от времени перестраивать эту таблицу.
Однозначного ответа нет. Или тратить время от раз в сутки до раз в месяц (в зависимости от потребности) для создания EAV по score, или пользовать sphinx.
...
Рейтинг: 0 / 0
10.06.2015, 22:25:51
    #38981684
login_sqlru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
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
10.06.2015, 22:56:36
    #38981708
login_sqlru
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите ускорить запрос MySQL
Ещё, в таблицу cache данные записываются в reference_id=5, score>=2 limit 7. Зачем в выборке с cache-а снова использовать в where те же фильтры. По скорости мелочь, но все же...

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

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


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