Получить одну большую запись или несколько небольших записей? - PullRequest
0 голосов
/ 28 февраля 2011

Мне интересно, что лучше для моего сервера (скорость и т. Д.), Учитывая использование процессора, пропускной способности и дискового пространства.

В настоящее время мой сервер собирается взорваться, слишком много запросов MySQL / PHP и т. Д.Вот почему я оптимизирую свое приложение (обсуждается в этом вопросе: Лучший способ масштабировать данные, сократить время загрузки, сделать мой веб-хост счастливым ).

Теперь, какое лучшее решение дляуменьшить загрузку процессора, пропускную способность и дисковое пространство?

1) Извлечь одну большую запись из таблицы (более 100 000 записей, скажем, 20 КБ / запись) и обработать выборку с помощью PHP => только 1 запроса,но результат может вызвать большую нагрузку на сервер?

2) Извлечь несколько небольших записей из таблицы (более 1 000 000 записей, скажем, 1 КБ / запись) => значительно больше запросов MySQL, необходимых для получения того же результатав результате метод 1

Метод 1 приведет к тому, что база данных станет большим ГБ (10+).При использовании метода 2 база данных будет меньше, но я не уверен относительно влияния большого количества запросов на производительность моего приложения?

Возвращение mysql_result () из таблицы 1.000.000+записи занимают больше времени, потому что нужно сканировать все строки на предмет определенных записей?

Надеюсь, вы можете сказать мне, какой метод лучше уменьшить использование процессора, пропускной способности и дискового пространства!

Edit

У меня сейчас одна таблица: facebook_id, friends_json.В friends_json хранится имя пользователя и имя каждого друга этого пользователя facebook_id.Используя этот метод, каждая запись составляет около 10 КБ.Как только эта запись запрошена, мне не нужно делать дополнительных запросов для получения имени друга: это уже включено в friends_json.

Мой вопрос заключается в том, лучше ли хранить только друзей?uids в friends_json, так что для каждого друга мне нужно выполнить запрос к другой таблице (friends_names), чтобы получить имя этого друга из этой таблицы (если недоступно, запросить его из Facebook).Этот второй метод экономит дисковое пространство, но мне действительно нужно выполнить большое количество запросов, прежде чем я смогу показать пользователю результат.

Цель состоит в том, чтобы мне пришлось сравнить список друзей в моей базе данных с текущимсписок друзей.Если пользователь удалил свой профиль на Facebook, я больше не могу запрашивать соответствующее имя, поэтому мне нужно сохранить имена в моей базе данных.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2011

Поскольку вопрос недостаточно ясен (или я не могу понять его правильно), я бы предположил, что у вас есть 1 таблица с 2 столбцами: facebook_id, friends_json, и вы запрашиваете всех друзей друзей.Это худший случай, о котором я могу думать.Тем не менее, все, что вам нужно сделать, это 2 простых запроса:

  1. получить предмет с 1 попаданием в индекс, а затем получить uid из json, расшифровав его
  2. получить список друзей всех друзей с помощью "в"запросите с использованием идентификаторов, а затем вставьте их все в карту, чтобы избавиться от дубликатов.

ни одному из указанных выше запросов не нужно сканировать всю таблицу (и ее худший случай)

если вы можете дать больше информации о структуре вашей таблицы и вашей цели (что вы хотите извлечь из этих данных), мы можем помочь больше.

Редактировать: Ничто не сможет спасти ваш сервер, если выЯ должен выполнять сканирование таблицы при каждом попадании.

Редактировать:

В настоящее время у меня есть одна таблица: facebook_id, friends_json.В friends_json хранится имя пользователя и имя каждого друга этого пользователя facebook_id.Используя этот метод, каждая запись составляет около 10 КБ.Как только эта запись запрошена, мне не нужно делать дополнительных запросов, чтобы получить имя друга: это уже включено в friends_json.

Мой вопрос: лучше ли хранить только друзей?uids в friends_json, так что для каждого друга мне нужно выполнить запрос к другой таблице (friends_names), чтобы получить имя этого друга из этой таблицы (если недоступно, запросить его из Facebook).Этот второй метод экономит дисковое пространство, но мне действительно нужно выполнить большое количество запросов, прежде чем я смогу показать пользователю результат.

Цель состоит в том, чтобы сравнить список друзей в моей базе данных с текущимсписок друзей.Если пользователь удалил свой профиль на Facebook, я не могу больше запрашивать соответствующее имя, поэтому мне нужно сохранять имена в моей базе данных.

Пока вы получаете результат с помощью нажатияИндекс размера таблицы или строки не повлияет так сильно, как вы думаете.И объединение только для того, чтобы получать имена, когда вы сохраняете нормализацию uid, не является подходящим способом.В любом случае вы сохраняете таблицу «users» со столбцами «uid, name» и таблицей дружбы «uid1, uid2», или у вас есть нормализованные данные, включая uid и name.А что касается сравнения новых и старых списков друзей, вы все равно должны сделать это в php, используя uid (а не имена).получить список друзей из Facebook, сравнить его с текущим списком друзей, найти различия и применить к базе данных.В этом случае вам не нужно сканировать таблицы в любой точке вашего приложения.

Вот обычный способ сделать это (без json):

fb_users table: uid, name, is_app_user (PK: uid) fb_friends table: uid1, uid2 (PK: uid1, uid2)

получить друзей sql запрос:

SELECT ff.uid1, fu.name FROM fb_friends ff
LEFT JOIN fb_users fu ON ff.uid1 = fu.uid
WHERE ff.uid2 = $FBID 
UNION
SELECT ff.uid2, fu.name FROM fb_friends ff
LEFT JOIN fb_users fu ON ff.uid2 = fu.uid
WHERE ff.uid1 = $FBID

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

INSERT INTO fb_users(uid,name) 
VALUES 
($FBUD1, $FBNAME1), 
($FBUD2, $FBNAME2) 
...
ON DUPLICATE KEY name = VALUES(name)

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

INSERT IGNORE INTO fb_friends(uid, uid1) VALUES(" . min($uid, $uid1) . ", " . max($uid, $uid1) . ");

это просто трюки, если вы решили сохранить свои данные реляционными, но я бы посоветовал сохранить ихвсе равно нормализовалось.Ваш метод json используется в большинстве случаев и не беспокоится о большом количестве места, поскольку размер данных обычно не блокирует серверы, а то, как вы запрашиваете данные (код) и как вы их захватываете (SQL запросов), где вы должны настроить.

0 голосов
/ 28 февраля 2011

Всегда запрашивайте то, что вам нужно, небольшими порциями.Пользователь может прервать выполнение скрипта, просто нажав ESC на своей клавиатуре [если у вас нет ignore_user_abort() на месте].Так что иди медленно и ровно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...