|
|
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток! Я в MySQL новичок и всегда её использовал как просто базу для хранения данных, все расчеты и вычисления делал на стороне php-интерпритатора. Но сейчас столкнулся с задачей... и так всё по порядку: 1. Будет несколько тысяч таблиц с полностью одинаковой структурой (в которых будет по несколько тысяч записей), это а. Поле типа TEXT, тут расчетов не будет ни каких, просто текст б. Поле типа целое число с максимально возможным значением, здесь мне нужен счетчик, который бы фиксировал запросы именно к этой строчке, т.е. если по запросу SELECT эта строка попадает в выборку, то значение этого поля увеличивается на один, при INSERT'e начальное значение - ноль, при UPDATE'е ни чего не происходит в. Поле типа дата, здесь мне нужно чтоб при INSERT разово добавлялась текущая дата, желательно со временем, но не обязательно, больше это значение ни когда не будет меняться. г. Ну и самое наверно сложное и главное: Поле типа дробное число, приблизительно с 10 знаками после запятой. Здесь мне нужна формула, т.е. значение этой ячейки будет зависить от полей "б" и "в", а вообще формула такая: 'б'/('текщая дата' - 'в'). Нужен индекс на это поле, но и значения как вы понимаете могут повторяться. т.е. большее число запросов в базу будут именно по этому значению. Например: SELECT * FROM `таблица` WHERE `г` > 0.005 and < 0.3 или SELECT * FROM `таблица` LIMIT 100 (в таком запросе должны выбраться 100 записей с максимальным значением поля `г`) значения в этом поле должны перерасчитываться хотя бы раз в сутки во всех таблицах ну или при UPDATE поля 'б' :( Ну и собственно вопрос, реализуемо ли это на MySQL? если нет то на чем бы Вы порекомендовали организовать такую базу. и насколько такая база будет быстрой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 12:34:05 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74Будет несколько тысяч таблиц с полностью одинаковой структурой (в которых будет по несколько тысяч записей)Всё, на этом мысль остановилась. Идите учить матчасть. Avaddon74нужен счетчик, который бы фиксировал запросы именно к этой строчке, т.е. если по запросу SELECT эта строка попадает в выборку, то значение этого поля увеличивается на один, при INSERT'e начальное значение - ноль, при UPDATE'е ни чего не происходитНереализуемо в рамках сервера MySQL (и вообще сервера БД). Вернее, реализуемо, но получится хрень собачья, да ещё и тормозная как я не знаю что. Avaddon74самое наверно сложноеФигня. Просто переопределённые данные - надо будет следить за их непротиворечивостью. Avaddon74реализуемо ли это на MySQL?Если не считать счётчика "обращений к записи" - как нефиг делать. Avaddon74и насколько такая база будет быстрой.На приличном железе при правильном проектировании БД - будет летать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 12:49:48 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
В целом реализуемо, кроме "по запросу SELECT эта строка попадает в выборку, то значение этого поля увеличивается на один". SELECT сам по себе не меняет данных в БД, так что придется делать отдельный UPDATE для этой операции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 12:50:18 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74и насколько такая база будет быстрой.Зависит от вашего представления о термине "быстрой" и от предъявляемых требований ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 12:52:23 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
AkinaВсё, на этом мысль остановилась. Идите учить матчасть. Так я сразу написал что новичок :) А не подскажете куда именно мне идти? :) AkinaФигня. Просто переопределённые данные - надо будет следить за их непротиворечивостью. Если честно, ни чего здесь не понял :) Хоть намекните куда мне идти :) Какими средствами это реализовать? я читал что триггеры сильно напрягают базу. AkinaЕсли не считать счётчика "обращений к записи" - как нефиг делать. Понятно, счетчик на php напишу. И все таки, каким образом реализовать поля дату и последнее поле с формулой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 13:04:36 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74или SELECT * FROM `таблица` LIMIT 100 (в таком запросе должны выбраться 100 записей с максимальным значением поля `г`)ордербай забыли Avaddon74я читал что триггеры сильно напрягают базу.сначала можно попробовать и на триггерах если действительно "будет напрягать" - перейдёте на периодическое обновление (период подберёте эмпирически) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 13:54:42 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74Понятно, счетчик на php напишу. И все таки, каким образом реализовать поля дату и последнее поле с формулой.В MySQL нет вычисляемых полей. Поэтому, для организации индекса, это поле экономнее тоже вычислить на php :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 14:44:51 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74А не подскажете куда именно мне идти? Я думаю, Вам надо идти туда, где учат. Например, на intuit.ru. Попробуйте начать отсюда . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 15:37:18 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Cygapb-007Avaddon74Понятно, счетчик на php напишу. И все таки, каким образом реализовать поля дату и последнее поле с формулой.В MySQL нет вычисляемых полей. Поэтому, для организации индекса, это поле экономнее тоже вычислить на php :)Да можно и триггером. Что триггеры (к тому же настолько простые) от души грузят сервер - это в общем сказки... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 15:38:14 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
AkinaЯ думаю, Вам надо идти туда, где учат. Например, на intuit.ru. Попробуйте начать отсюда . Так в том то и дело, зачем мне изучать полностью весь mysql и тратить на это несколько месяцев, если можно просто прочитать несколько функций касающихся конкретно моей тематики. Поэтому и спросил какими средствами это возможно реализовать? Я понял что триггером. Буду ковырять в эту сторону. Ну вот например. Ставлю полю тип datetime в значение по умолчанию пишу now(), sysdate(), CURRENT_TIMESTAMP и на все пишет что неправильное значение по умолчанию. Поэтому и возник такой вопрос. Реализуемо ли это, если банальные функции не работают в значениях по умолчанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 16:48:48 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74Так в том то и дело, зачем мне изучать полностью весь mysql и тратить на это несколько месяцевВы преувеличиваете, за два-три дня можно прочитать большую часть документации по MySQL.Avaddon74, если можно просто прочитать несколько функций касающихся конкретно моей тематики.Потребительское отношение не очень распологает к активной помощи.Avaddon74Ну вот например. Ставлю полю тип datetime в значение по умолчанию пишу now(), sysdate(), CURRENT_TIMESTAMP и на все пишет что неправильное значение по умолчанию. Поэтому и возник такой вопрос. Реализуемо ли это, если банальные функции не работают в значениях по умолчанию.Функции, действительно, не работают в значениях по умолчанию. Вариантов тут два: 1) Писать нужную дату/время при INSERT-е. Подварианты - триггером или SQL-запросом, серверное время или клиентское. 2) Использовать тип TIMESTAMP (только серверное время). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 16:58:52 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
tanglirперейдёте на периодическое обновление (период подберёте эмпирически) Что Вы имеете ввиду? через schedule выполнение скрипта? Для примера я подсчитал скорость обработки запросов в базу. В цикл добавил insert и получил два варианта добавления строк это INSERT INTO `base`(`a`, `b`) VALUES ('1', '2'), ('1', '2'), ('1', '2'), ('1', '2'), ('1', '2'), ('1', '2') и INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') так вот в первом варианте добавилось порядка 25-30 тысяч записей в 1-2 секунды - это я считаю нормальная скорость, а вот во втором варианте, собственно как и будет работать, так как будет множество различных запросов на insert и update, скорость получилась совсем маленькая порядка 8 тысяч записей в 5 минут - это 26-27 записей в секунду. Если обновление значений будет выполняться во всех таблицах (несколько тысяч) в которых по несколько тысяч записей, я предполагаю что на это уйдет не один час :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 17:05:05 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
miksoftПотребительское отношение не очень распологает к активной помощи. Прошу прощения за моё высказывание. miksoftФункции, действительно, не работают в значениях по умолчанию. Вариантов тут два: 1) Писать нужную дату/время при INSERT-е. Подварианты - триггером или SQL-запросом, серверное время или клиентское. 2) Использовать тип TIMESTAMP (только серверное время). 1. Да, я это уже понял, спасибо 2. Судя по описанию этот тип поля обновляется постоянно при update и inserte? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 17:10:47 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74Для примера я подсчитал скорость обработки запросов в базу. В цикл добавил insert и получил два варианта добавления строк это INSERT INTO `base`(`a`, `b`) VALUES ('1', '2'), ('1', '2'), ('1', '2'), ('1', '2'), ('1', '2'), ('1', '2') и INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') INSERT INTO `base`(`a`, `b`) VALUES ('1', '2') так вот в первом варианте добавилось порядка 25-30 тысяч записей в 1-2 секунды - это я считаю нормальная скорость, а вот во втором варианте, собственно как и будет работать, так как будет множество различных запросов на insert и update, скорость получилась совсем маленькая порядка 8 тысяч записей в 5 минут - это 26-27 записей в секунду. Если обновление значений будет выполняться во всех таблицах (несколько тысяч) в которых по несколько тысяч записей, я предполагаю что на это уйдет не один час :)Откуда происходят записи? возможна ли их буферизация (и за какой период)? Какой движок таблицы используется? Если InnoDB, то как настроен innodb_flush_log_at_trx_commit ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 17:13:55 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon742. Судя по описанию этот тип поля обновляется постоянно при update и inserte?Настраивается отдельно для того и для другого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 17:20:40 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74зачем мне изучать полностью весь mysql и тратить на это несколько месяцев, если можно просто прочитать несколько функций касающихся конкретно моей тематики. Поэтому и спросил какими средствами это возможно реализовать? Я понял что триггером. Буду ковырять в эту сторону.Например, почитайте Работа с trigger (триггерами) в MySQL . Возможно, для ваших целей этого будет достаточно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 17:20:50 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
miksoftОткуда происходят записи? возможна ли их буферизация (и за какой период)? Какой движок таблицы используется? Если InnoDB, то как настроен innodb_flush_log_at_trx_commit ? записи отправляю из php через mysql_query движок innoDB на остальные вопросы ответа пока нет :) Спасибо за ссылку, будем курить :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 17:25:12 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Большое спасибо по поводу innodb_flush_log_at_trx_commit. Действительно при переключение логирования в режим 0 скорость на insert'e увеличилась многократно с 26 до 5800 записей в секунду, если не выполнять select, если ещё параллельно использовать на каждый insert запрос select то скорость insert'ов выросла до 150 в секунду, но это и не нужно, просто для тестирования. Одна проблема решена. Возникла другая проблема. После добавления триггера при insert выдает ошибку 1442 я так понял, что при обновление ячейки в той же таблице куда вставляется запись запись не может вставиться потому что заблокировано тем же триггером? CREATE TABLE `base3` ( `id` int(10) NOT NULL AUTO_INCREMENT, `word` varchar(100) DEFAULT NULL, `view` int(1) DEFAULT NULL, `date` int(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=cp1251; DELIMITER ;; CREATE TRIGGER `update_date` AFTER INSERT ON `base3` FOR EACH ROW update `base3` set `date`= '1' WHERE `id`= new.id;; DELIMITER ; при запросе INSERT INTO `base3` SET `word`='слово', `view`='1' выдает ошибку 1442 :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 20:33:07 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon74, У MySQL очень ограничена (или вообще запрещена, точно не помню) модификация в триггере той же таблицы, на которую этот триггер повешен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 21:23:44 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
miksoftУ MySQL очень ограничена (или вообще запрещена, точно не помню) модификация в триггере той же таблицы, на которую этот триггер повешен. Ну получается вернулись к тому с чего начали :) т.е. задачи которые я поставил изначально, нереализуемы на mysql, т.к. все расчеты все равно придется выполнять на php? такие как счетчик, поле дата и поле с формулой. 1. счетчик нереализуем т.к. вообще такого не существует в базах как подсчет обращений к записям. пишем на php 2. В поле дата нельзя задать функцию по умолчанию, и триггером нельзя редактировать ту же таблицу при insert'e, опять же придется писать на php 3. Формулы тоже не поддерживает, а перерасчет многотысячных записей занимает продолжительное время. Так куда мне идти? какие базы ответят этим запросам? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 21:39:57 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon742. В поле дата нельзя задать функцию по умолчанию, и триггером нельзя редактировать ту же таблицу при insert'e, опять же придется писать на php 3. Формулы тоже не поддерживаетПонятно. Писатель. Все же попробуйте еще раз почитать предыдущую ссылку про триггеры, вдруг поможет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 21:54:30 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
miksoftУ MySQL очень ограничена (или вообще запрещена, точно не помню) модификация в триггере той же таблицы, на которую этот триггер повешен. Это не относится к модификации данных, вставляемых в обрабатываемую в данный момент запись! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 22:08:21 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 22:24:36 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
Avaddon742. В поле дата нельзя задать функцию по умолчанию Это не так. Если выбран тип поля TIMESTAMP, то в качестве дефолтного значения может быть использована функция CURRENT_TIMESTAMP. Причём не только для новой запис, но и при изменении записи: Код: sql 1. 2. 3. Правда, если в таблице несколько полей типа TIMESTAMP, всё описанное выше документировано лишь для первого из них в структуре таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2013, 22:31:00 |
|
||
|
Реализуемо ли?
|
|||
|---|---|---|---|
|
#18+
miksoftВ целом реализуемо, кроме "по запросу SELECT эта строка попадает в выборку, то значение этого поля увеличивается на один". SELECT сам по себе не меняет данных в БД, так что придется делать отдельный UPDATE для этой операции. реализуемо на процедурах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.09.2013, 09:44:42 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38392320&tid=1836058]: |
0ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 344ms |

| 0 / 0 |
