|
|
|
| Всем привет.
Есть таблица в которой будут предположительно около 50 000 строк.
И скрипт кеоторый по ходу будет запускаться паралельно на разных компьютер тоже около 1000 раз (паралельно).
Мне надо в базе держать букву и её количество.
Тоесть A5, Z28, P14 и так далее
Не могу понять, что с точки зрения эффективности лучше, 10 колонок в таблице где по отдельности буква, а во второй колонке её количество или 5 колонок в которых будет записанно одновременно и буква и количество, а парсинг делать скриптом.
Тоесть:
Вариант 1, 10 ячеек:
|A|1|B|14|C|36|D|18| ...
Или чтото такое:
A1| B14| C36| D18| ...
Что с точки зрения время исполнения и ситемных ресурсов лучше?
Заранее благодарю. Надеюсь понятно объяснил =) | |
|
|
|
|
|
|
|
для: valenok
(23.11.2006 в 12:42)
| | Зависит от того, что делает этот самый скрипт.
Может поподробнее задачку опишите? | |
|
|
|
|
|
|
|
для: Trianon
(23.11.2006 в 12:46)
| | Вкралась опечатка, в базе 500 000 строк..
Скрипт сам по себе очень большой и требует больших системных ресурсов.
Вопрос был в том, что эффективней,
ставить в базе 10 колонок
в скрипте цикл прогонять 10 раз
или в базе 5 колонок
цикл прогонять 5 раз, но в цикле добавить нечто вроде
$var1 = $var{0}; $var2 = $var{1};
Размер базы в обоих случаях тот же, вопрос в кол-ве. колонок,
или запуске циклов.
--
Сам скрипт это чтото вроде того что у пользователя есть 5 букв, каждой буквы есть определённое количество, ему надо составить слова из этих букв. Если он использует букву, количество этой буквы спускается, а когда он использует все буквы "А" то а таблице колонка отведённая под букву А опусташается.
Не надо мне говорить что у меня не правильная реализация старинной и известной русской игры, просто надо объяснить что с точки зрения сисетмных требований эффективней.
Объём информации в базе остаётся тем же не взирая на количество стобцов. | |
|
|
|
|
|
|
|
для: valenok
(23.11.2006 в 19:26)
| | Если никакого поиска по этим буквам не предвидится, то эффективнее всего сделать одно поле фиксированной (достаточной) длины, и в нем хранить всё. И набор букв, и их "остатки".
Если остатки, конечно, скромных размеров. В противном случае - 6 полей.
Набор букв char(5) и пять счетчиков типа TINYINT (SMALLINT, INT если не лезет)
В любом случае полей VARCHAR, TEXT, BLOB нужно избежать. | |
|
|
|
|
|
|
|
для: Trianon
(23.11.2006 в 19:55)
| | Букв всего 5.
Макс. количество одной буквы это 999 999
Всмысле при максимальных значениях в базе будут находиться следующие значения:
999999А
999999Б
999999В
999999Г
999999Д
Ты предлагаешь вписать всё в одно поле а скриптом делать парсинг?
И при этом избегать поля Varchar, text, blob ?
Не представляю как.
Тогда придётся использовать 5 полей, мало того Varchar ...
А ещё тогда просто метод парсинга $var1 = $var{0}; $var2 = $var{1};
не подойдёт.. | |
|
|
|
|
|
|
|
для: valenok
(23.11.2006 в 20:28)
| | нет. Если макс. число миллион, то так.
id INT(11),
letters CHAR(5), -- АБВГД
cnt1 MEDIUMINT(6), -- 999999
cnt2 MEDIUMINT(6), -- 999999
cnt3 MEDIUMINT(6), -- 999999
cnt4 MEDIUMINT(6), -- 999999
cnt5 MEDIUMINT(6), -- 999999
|
в 24...32 байта запись можно втиснуть. Не считая индекса. | |
|
|
|
|
|
|
|
для: Trianon
(23.11.2006 в 20:34)
| | А обрабатывать тогда наиболее эффективным методом как?
И при этом не забывать что Apache + PHP тянут больше сис. ресурсов чем MySQL ? | |
|
|
|
|
|
|
|
для: valenok
(23.11.2006 в 20:38)
| | Вы же не сказали, какие операции выполняете с этой таблицей. Даже структуру её полностью не привели. Сказали отвечать сугубо по вопросу. По вопросу и ответил. | |
|
|
|
|
|
|
|
для: Trianon
(23.11.2006 в 20:52)
| | Cтруктуру таблицы вы сами привели :
id INT(11),
letters CHAR(5), -- АБВГД
cnt1 MEDIUMINT(6), -- 999999
cnt2 MEDIUMINT(6), -- 999999
cnt3 MEDIUMINT(6), -- 999999
cnt4 MEDIUMINT(6), -- 999999
cnt5 MEDIUMINT(6), -- 999999
|
| |
|
|
|
|
|
|
|
для: valenok
(23.11.2006 в 22:09)
| | Ну и операции само собой SELECT INSERT UPDATE всё.. | |
|
|
|
|
|
|
|
для: valenok
(24.11.2006 в 11:07)
| | с where id=... (если id - primary key) и SELECT и UPDATE будут выполняться мгновенно.
INSERT тоже. | |
|
|
|
|
|
|
|
для: Trianon
(24.11.2006 в 13:09)
| | А теперь попробую изложить проблему по другому для того чтобы получить однозначный ответ
Скрипт работает паралельно на 1000 компьютерах.
В базе 500 000 строк.
Как по вашему должна выглядеть база и кусок скрипта который будет брать из базы
набор букв и их количество.
В каждой строке в базе дожны находиться пять определённых букв, в нашем случае это А, Б, В, Г и Д
Теперь каждому ползователю скрипта принадлежит одна строка в базе, к примеру с индетификатором ID = 217259, которsq хранится в сессии.
Пользователь использует букву А, и в базе списывается количество букв А для этого пользователя на одну единицу.
Как по вашему должна выглядеть база и кусок скрипта который будет брать из базы
набор букв и их количество.
Требования: наименьшие системные требования, наивысшая скорость исполнения. Вообщем - эффективность.
Заранее благодарю. | |
|
|
|
|
|
|
|
для: valenok
(24.11.2006 в 16:12)
| | Я может не очень понял условие, но я бы вообще оставил три колонки:
буква | частота | идентификатор юзера.
номер сессии вынес бы в отдельную таблицу. Ну и все проиндексировал, понятное дело. | |
|
|
|
|
|
|
|
для: Loki
(24.11.2006 в 16:38)
| | Есть такая игра. У тебя всего 15 фишек, на каждой фишке 1 буква.
Всего в игре 5 разных букв и они А, Б, В, Г и Д
Тоесть в самом начале игры у тебя 5 фишек с буквой А, 5 Б, 5 В ...
Ты составил слово, тебе в другой таблице начислилось 10 очков. При составе слорва ты использовал буквы три буквы Г, А и В
Их количество в базе тебе следует списать, тоесть у тебя осталось 4 фишки Г, 4 фишки А и 4 фишки В
Как следует записывать в таблице количество оставшихся у тебя букв ?
Как в скрипте получить а отдельные переменные количество букв и саму букву?
Тоесть:
$letter_1 = 'A';
$quantity_1 = '4';
$letter_2 = 'B';
$quantity_2 = '4';
$letter_3 = 'Д';
$quantity_3 = '4'; | |
|
|
|
|
|
|
|
для: valenok
(24.11.2006 в 16:55)
| | Планируется около 1000 обновлений базы в минуту UPDATE
И 1000 выборок в мин. SELECT
её максимальный размер будет
6-ти значный идентификатор строки / пользователя
5 букв
5 шестизначных цифр означающих количество той или иной буквы
Тоесть при макс. значениях, в базе будут записанны
6+5+6*5 = 41 байт на строку
500 000 строк = 20500 кб = 20 мб
Так?
И всё же вопрос: как следует делать таблицу? Как она должны выглядеть для того чтобы можно было достичь эффективнейшего исполнения скрипта. | |
|
|
|
|
|
|
|
для: valenok
(24.11.2006 в 16:12)
| | Что то я не понял, на разных строках (т.е. у разных пользователей) разные наборы букв? Или у всех А Б В Г Д ? | |
|
|
|
|
|
|
|
для: Trianon
(24.11.2006 в 18:02)
| | У каждого разные | |
|
|
|