Подскажите по MySQL

Orangesoda
На сайте с 22.08.2010
Offline
17
723

Добрый день!

Есть таблица MySQL


CREATE TABLE IF NOT EXISTS `messages` (
`user_from` int(11) NOT NULL,
`user_to` int(11) NOT NULL,
`date` datetime NOT NULL,
`content` tinytext CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Вопрос: как добиться наименьшего времени выполнения запросов типа


SELECT * FROM messages WHERE user_from = 1
SELECT count(*) FROM messages WHERE user_from = 1
SELECT * FROM messages WHERE user_to = 1
SELECT count(*) FROM messages WHERE user_to = 1

В таблице 10М строк.

n0name
На сайте с 22.12.2006
Offline
54
#1

Создать индексы для user_from и user_to


ALTER TABLE `messages` ADD INDEX ( `user_from` );
ALTER TABLE `messages` ADD INDEX ( `user_to` );
Сервис сравнения цена на VPS (http://vpska.com/)
DV
На сайте с 01.05.2010
Offline
644
#2

По-моему, никак. Любой запрос приводит к перебору всех строк. Разве что с индексацией помудрить, но тут я не советчик.

Скажу-ка крамольную, но рабочую идею У меня недавно стояла задача заливки контента в базу, при этом с проверкой на уникальность. Строк около 200К. Запустил скрипт, сижу, смотрю. Жёсткий тарахтит, одна строка в секунду добавляется... Посчитал, прикинул, подумал — ну нафиг. Снял задачу. Поставил RAM диск, перенёс папку data туда. Запустил, вот это другое дело. Около 6 строк в секунду, под конец тормозить стало, но за сутки управился. Потом слил дамп, перенёс всё на жёсткий. Усё.

VDS хостинг ( http://clck.ru/0u97l ) Нет нерешаемых задач ( https://searchengines.guru/ru/forum/806725 ) | Перенос сайтов на Drupal 7 с любых CMS. ( https://searchengines.guru/ru/forum/531842/page6#comment_10504844 )
n0name
На сайте с 22.12.2006
Offline
54
#3
DenisVS:
Скажу-ка крамольную, но рабочую идею У меня недавно стояла задача заливки контента в базу, при этом с проверкой на уникальность.

Если строки небольшие были, то поставили бы на поле с текстом уникальный индекс. В другом случае, можно было бы создать дополнительное поле с хэшем текста. И уже на это поле индекс ставить.

DV
На сайте с 01.05.2010
Offline
644
#4

n0name

Буду знать, спасибо.

Orangesoda
На сайте с 22.08.2010
Offline
17
#5

n0name,

С индексами понятное дело.

Как лучше 2 индекса отдельно или составной, или вместе?

Я вот еще чего хотел узнать больше всего, первичный ключ нужен или нет в данной ситуации?

Ведь у InnoDB есть свойство проводить сортировку не по индексу, а по первичному ключу и индексу.

Dreammaker
На сайте с 20.04.2006
Offline
569
#6

что имеете в виду под

Orangesoda:
или вместе?

в данном случае 2 индекса простых, составные не нужны, если поля задействуются в одном запросе, да и то нужно смотреть в зависимости от условий какой индекс будет.

n0name
На сайте с 22.12.2006
Offline
54
#7
Orangesoda:
n0name,
С индексами понятное дело.
Как лучше 2 индекса отдельно или составной, или вместе?
Я вот еще чего хотел узнать больше всего, первичный ключ нужен или нет в данной ситуации?
Ведь у InnoDB есть свойство проводить сортировку не по индексу, а по первичному ключу и индексу.

Для таких запросов, которые указали лучше на каждое поле по отдельному индексу. Первичный ключ тут лишний (опять же, если судить по указанным запросам).

Orangesoda
На сайте с 22.08.2010
Offline
17
#8

ОК, понятно.

Всем огромное спасибо, а особенно n0name.

N
На сайте с 06.05.2007
Offline
419
#9

Оптимальнее всего такого рода запросы на агрегацию облегчать специальными полями, изменяющимися при добавлении или удалении первичных записей.

Добавили сообщение - изменили число сообщений к юзеру и юзера в основной таблице юзеров.

Конечно, при выборе способа нужно оценить соотношение обновлений и чтений этой информации.

Кнопка вызова админа ()
Orangesoda
На сайте с 22.08.2010
Offline
17
#10

netwind,

касаемо count-запросов могу сказать, что кешировать их буду немного по-другому

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий