Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 4 [5] 6 7   Вниз
  Печать  
Автор Тема: Всякие вопросы по MySQL 5.0+  (Прочитано 133246 раз)
0 Пользователей и 28 Гостей смотрят эту тему.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #120 : 27-10-2009 08:38 » 

SELECT year(t), month(t), day(t), hour(t), minute(t), second(t)
  FROM (select _time_ as t from log) as tab;
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #121 : 27-10-2009 09:36 » 

Думаю, что эстетичнее уже не будет:

Код:
SELECT
  l._time_ `time`,
  year(l._time_) `year`,
  month(l._time_) `month`,
  day(l._time_) `day`,
  hour(l._time_) `hour`,
  minute(l._time_) `minute`,
  second(l._time_) `second`
FROM log l;

Я бы еще ORDER BY  добавил.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #122 : 27-10-2009 09:51 » 

спасибо, с этим разобрался. Но пришлось отказаться - слишком сложно выходит, так как надо ещё и другие поля выбрать (

собственно , запрос такой (и вопрос по нему) . Все имена реальные, чтоб не перепутать ничего )
Код:
delimiter \\
create procedure Proc1(
in IDfrom_including BIGINT
,in limit_number BIGINT
)begin
select
mess_id
,year( jour_ferrum_time) f_yer
,month( jour_ferrum_time) f_mon
,day( jour_ferrum_time) f_day
,hour( jour_ferrum_time) f_hou
,minute(jour_ferrum_time) f_min
,second(jour_ferrum_time) f_sec
,year( jour_save_time) s_yer
,month( jour_save_time) s_mon
,day( jour_save_time) s_day
,hour( jour_save_time) s_hou
,minute(jour_save_time) s_min
,second(jour_save_time) s_sec
,jour_obj_number
,jour_mess_type
,jour_data
,jour_isdata
,jour_user
from JOURNAL_LOG
where mess_id>=IDfrom_including
order by mess_id desc
    limit limit_number;
 -- limit 1000;
end

вот так процедура не желает создаваться, ругается на "limit limit_number".
Если эту строчку заремить и поставить константу (limit 1000), то всё нормально. Как же мне из переменной (вернее, параметра) взять значение ?
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #123 : 27-10-2009 09:55 » 

Я бы еще ORDER BY  добавил.
сортировать по времени мне не нужно Улыбаюсь
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #124 : 27-10-2009 10:18 » 

http://dev.mysql.com/doc/refman/5.1/en/select.html

Цитата
The LIMIT clause can be used to constrain the number of rows returned by the SELECT statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants (except when using prepared statements).

Вот и ответ: либо формируй строку запроса на стороне клиента, либо в процедуре используй prepared statement.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #125 : 27-10-2009 10:36 » 

то есть,  если не константа, то вся прелесть встроенной процедуры киту под хвост ? Улыбаюсь
Придётся константу оставлять

Если честно, не могу понять данное ограничение
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #126 : 27-10-2009 10:51 » 

придумал:
Код:
...
 in IDmax_including BIGINT
,in IDmin_including BIGINT
...
select .... where ID>=IDmin_including and ID<=IDmax_including BIGINT
..

IDmin_including вычисляется в программе примерно, по ID (делаем предположение, что значения счётчика ID идут инкрементально по +1)

-------------------------

собственно, можно и точно посчитать:
Код:
select min(mess_id) from (select mess_id from journal_log order by mess_id desc limit 1000) T;
« Последнее редактирование: 27-10-2009 11:04 от Алексей1153++ » Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #127 : 27-10-2009 11:46 » 

Понять ограничение не сложно: оптимизатор плана выполнения не работает с параметрами-переменными, а знание параметров LIMIT, видимо, ему важно.

Код:
CREATE PROCEDURE get_t1(IN p_limit INT)
BEGIN
SET @stm = 'SELECT * FROM t1 LIMIT ?';
PREPARE stm FROM @stm;
SET @tmp_limit = p_limit;
EXECUTE stm USING @tmp_limit;
DROP PREPARE stm;
END;

Обрати внимание, что возможна ошибка при EXECUTE - тогда оператор stm не удалится и его либо вручную надо удалить, либо закрыть сессию. Может быть обработка исключений спасет. Или тщательная отладка запросов.

Напоминаю, что переменные, начинающиеся с "@" - это не локальные переменные, а переменные сессии. Они типа переменных окружения: не имеют типа (просто текст) и глобальны в рамках сессии.
« Последнее редактирование: 27-10-2009 13:34 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #128 : 27-10-2009 12:11 » 

ну то есть, по сути, всё это мало отличается от строки запроса, формируемой в программе.

Я уже сделал через min и max вместо limit
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #129 : 27-10-2009 13:35 » 

Леш, что значит не отличается?


LIMIT дает тебе определенное (или меньшее) количество строк. WHERE тебе может и 0 строк выдать, вместо 1000, хотя данные в таблице есть.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #130 : 27-10-2009 15:19 » 

эхъ. Некогда сейчас на этом заостряться, в общем, я сделал через where, который полноценно заменил limit для моей задачи Улыбаюсь
Записан

Kivals
Команда клуба

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #131 : 27-10-2009 16:03 » 

Ну это в случае если записи не будут удаляться. Если же что-либо удалили - то как писал RXL у тебя вместо ожидаемых 1000 вполне может вернуть 999, 1 или 0 записей... Улыбаюсь
При этом в втором блоке запроса (от 1001 до 2000) может быть и все 1000 записей.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #132 : 27-10-2009 16:27 » 

ну это для меня не так важно, в конце концов можно транзакцию запустить )  А удаляться не должны, кстати
--------------------
Сейчас буду разбираться с embedded, наверное. Не прям сейчас, а завтра то есть ))
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #133 : 27-10-2009 17:39 » 

Еще один недостаток варианта поста 126 - наверняка это будет работать дольше.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #134 : 28-10-2009 04:00 » 

RXL, по каким причинам дольше ? Ведь первый запрос лишь посчитает минимальный и максимальный ID
у меня сейчас это так выглядит
Код:
select count(*),min(mess_id),max(mess_id) from (select mess_id from journal_log order by mess_id desc limit <константа>) T;

второй запрос - вызов процедуры, где условие будет
Код:
...
select ... from table where mess_id>=minID and mess_id<=maxID  order by mess_id desc
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #135 : 28-10-2009 04:36 » 

Используй EXPLAIN для сравнения запросов. Еще попробуй замерять время выборки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #136 : 28-10-2009 11:56 » 

снова насчёт совместимости с другими программами: а реально ли сделать так:

1) выбираю из папки с MySQL то, что требуется для работы
2) этот пакет использую для установки - просто копирую на машину, где хочу установить свою программу, также докидываю в папку свой ini
3) пути запоминаю - где что положил

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

работоспособно ?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #137 : 28-10-2009 13:31 » 

Речь о клиенте или о сервере тоже?
Клиенту достаточно конфига и библиотек, а сервер надо еще и запускать - нужно сервис регистрить (можно через реестр сделать).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #138 : 29-10-2009 03:52 » 

я тут в терминах ещё не очень. Насколько понимаю, "клиент" - это ты имеешь в виду комп, где нет базы, и который удалённо через сеть подключается к базе на другом компе ?

Вообще то у меня программа-сервер и база всегда на одной машине и удалённо напрямую к базе никто не подключается. То есть, у меня только "сервер".

Итак, копирую папку с СУБД на машину. Регистрирую сервис - как ? А если сервис уже был зарегистрирован, получается я поверх перезапишу ? Кстати, зачем сервис?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #139 : 29-10-2009 05:10 » 

Клиент - программа, работающая с сервисом.
Сервер - программа, предоставляющая сервис.
Совершенно не важно, разнесены ли они или нет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #140 : 29-10-2009 05:21 » 

Пример сервиса MySQL в реестре винды:

Код:
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL51]
"Type"=dword:00000010
"Start"=dword:00000003
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):22,00,43,00,3a,00,5c,00,50,00,72,00,6f,00,67,00,72,00,61,00,\
  6d,00,20,00,46,00,69,00,6c,00,65,00,73,00,5c,00,4d,00,79,00,53,00,51,00,4c,\
  00,5c,00,4d,00,79,00,53,00,51,00,4c,00,20,00,53,00,65,00,72,00,76,00,65,00,\
  72,00,20,00,35,00,2e,00,31,00,5c,00,62,00,69,00,6e,00,5c,00,6d,00,79,00,73,\
  00,71,00,6c,00,64,00,22,00,20,00,2d,00,2d,00,64,00,65,00,66,00,61,00,75,00,\
  6c,00,74,00,73,00,2d,00,66,00,69,00,6c,00,65,00,3d,00,22,00,43,00,3a,00,5c,\
  00,50,00,72,00,6f,00,67,00,72,00,61,00,6d,00,20,00,46,00,69,00,6c,00,65,00,\
  73,00,5c,00,4d,00,79,00,53,00,51,00,4c,00,5c,00,4d,00,79,00,53,00,51,00,4c,\
  00,20,00,53,00,65,00,72,00,76,00,65,00,72,00,20,00,35,00,2e,00,31,00,5c,00,\
  6d,00,79,00,2e,00,69,00,6e,00,69,00,22,00,20,00,4d,00,79,00,53,00,51,00,4c,\
  00,35,00,31,00,00,00
"DisplayName"="MySQL51"
"WOW64"=dword:00000001
"ObjectName"="LocalSystem"

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL51\Security]
"Security"=hex:01,00,14,80,b8,00,00,00,c4,00,00,00,14,00,00,00,30,00,00,00,02,\
  00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\
  00,00,02,00,88,00,06,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\
  05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\
  20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,04,00,00,00,00,\
  00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,06,00,00,00,00,00,14,00,00,01,\
  00,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,00,18,00,fd,01,02,00,01,02,00,\
  00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,00,00,00,00,00,05,12,00,00,00,\
  01,01,00,00,00,00,00,05,12,00,00,00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL51\Enum]
"0"="Root\\LEGACY_MYSQL51\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001

Значит так:
1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\
Тут хрянятся описания сервисов винды.

2. Переходим к MySQL51.
Start указывает метод запуска: авто/вручную/запрещено - надо авто (на примере - вручную).
ImagePath - строка запуска сервера. В примере:
"C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --defaults-file="C:\Program Files\MySQL\MySQL Server 5.1\my.ini" MySQL51
DisplayName - как сервис называется в панели управления сервисами.

3. Раздел Security.
Security - ничего про него не знаю, но такое ощущение, что эти блоки в разных сервисах одинаковы.

5. Раздел Enum.
Думаю, можно один в один скопировать.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #141 : 29-10-2009 06:43 » 

а название сервиса MySQL51 - можно произвольное задать ?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #142 : 29-10-2009 14:31 » 

Алексей1153++, да - можно же несколько сервисов сразу иметь с разными именами.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #143 : 02-11-2009 04:22 » 

содержимое папки bin: какие файлы из перечисленных мне никогда не понадобятся ?
Какие надо оставить для сервера, какие для клиента ?
(привёл весь список из папки bin)
Код:
comp-err.exe
libmySQL.dll
myisamchk.exe
myisamlog.exe
myisampack.exe
myisam_ftdump.exe
mysql.exe
mysqladmin.exe
mysqlbinlog.exe
mysqlcheck.exe
mysqld-debug.exe
mysqld-max-nt.exe
mysqld-max.exe
mysqld-nt.exe
mysqld.exe
mysqldump.exe
mysqlimport.exe
MySQLInstanceConfig.exe
mysqlshow.exe
mysqltest.exe
mysql_client_test.exe
my_print_defaults.exe
perror.exe
replace.exe
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #144 : 02-11-2009 04:30 » 

На такой вопрос ответить очень сложно.
Может быть тебе не нужны:
mysqld-debug.exe
mysqld-max-nt.exe
mysqld-max.exe
mysqld.exe
myisampack.exe
myisam_ftdump.exe
mysqladmin.exe
mysqlbinlog.exe
mysqlimport.exe
MySQLInstanceConfig.exe

Точно нужны:
mysqld-nt.exe
libmySQL.dll

Желательны:
myisamchk.exe
mysql.exe
mysqldump.exe

Остальное - лотерея.
« Последнее редактирование: 02-11-2009 04:33 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #145 : 02-11-2009 04:38 » 

понятно, попробую без "ненужных", ну а если вдруг понадобится - можно всегда дать полльзователям SFX , который докинет нужное, а в дистрибутив доложить вручную )
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #146 : 02-11-2009 04:43 » new

Леш, ты таки embedded попробовал?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #147 : 02-11-2009 04:50 » 

\data\
 ib_logfile0
 ib_logfile1
 ibdata1

а это что за объёмное чудо такое появилось ? ))



Леш, ты таки embedded попробовал?
нет, руки не дошли. Сейчас дистрибутив собираю для не-embedded
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #148 : 02-11-2009 10:26 » 

А это у тебя innodb разрешено и, соотв., он создает логи и табличное пространство. Если не используешь этот тип таблиц, то поставь в конфиге сервера skip-innodb, перезапусти сервер и можно эти файлы удалить. Только сперва убедись, что используешь MYISAM, а не INNODB - иначе нафиг все удалишь... Улыбаюсь
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #149 : 02-11-2009 10:39 » 

эт я уже разобрался, причём, если выставлено skip-innodb в ini , то вместо 10М озу сервис съедает всего 5 )
Записан

Страниц: 1 2 3 4 [5] 6 7   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines