-
P19 окт 05>> Вот тут уже проблема, намного оптимальнее делать выборку по DATE, чем в запросе модифицировать INT`овое поле даты в нужный вид и сравнивать его с нужной датой.
Во-первых, вообще-то для собственно выборки надо всё сделать с точностью до наоборот — перевести нужную дату в инт и сравнивать в запросе интовое поле даты (проиндексированное, конечно), с интом. Представление дат в любых видах с точностью до дня (типа YYYY-MM-DD) имеет смысл только если где-то нужна группирока по этому полю.
Во-вторых, сама проблема высосана из пальца. Где именно место собрались экономить? На винте? Полметра? Бу-га-га. В памяти? Полметра? Во-первых, тоже бу-га-га. Во-вторых, в памяти наверняка числа всё равно представит согластно машинному представлению, т.е. по 4 байта. Во-вторых, потеря ресурсов на всякие дополнительные вычисления связанные с такой "оптимизацией" перекроет потерю этих полметра в разы и может превратиться из практически незначительной в заметную. В-последних, если вам надо иметь 500К записей и всех их гонять в каждом запросе без индекса — значит вам на самом деле надо что-то поменять в алгоритмах, а не в представлении данных. -
-
23 сен 05Если тебе не нужны секунды, попробуй так. Дата это количество дней от определенного числа, (в дельфях от 1899го года) если тебе нужно датировать ньюсы, то я дкмаю подойдет и от 2000го или 1990го, тогда
2005.1.10 равно 2005-1990=15(неохото считать весокосные, скажем их было 4)*365+10=5485 такое число может описывать текущую дату. 2байта могут хранить от 0 до 65535, тогда твоя дата займет 2байта. По аналогии поступи со временем. 24*60*60=86400 — 3байта, без секунд 2байта. Тогда при грамотном подходе можно использовать 4байта. Для выборки подсчитай дату и смотри на совпадение.-
Trinux АВТОР23 сен 05Тогда при грамотном подходе можно использовать 4байта
Ну я имею те же 4 байта без гемороя при структуре INT(10). Хотя это и есть то, что ты описал. Это насчет времени. Я тестил эту бню (то что ты предложил, 2 байта без сикунд) — хрен там, погрешность выскакивает. Так хронить время нельзя. А твое предложение по дате — надо подумать, хотя и так видно что выборка уже затруднится (нужны дополнительные вычисления) и так далее.-
23 сен 05Я не понял по поводу погрешности. 24*60=1440, 256*256=65536
значит минуты и часы в 2байта укладываются легко, даже с четвертями минути. Число 515 например в часы минуты переводится так:
515 div 60 = 8 hours
515 — 8*60 = 35 mins
тотже трюк с датами. То, что иксы хранят datetime в четырех байтах — неверно! В дэльфях например используется 8byte, float или double, где первые четыре байта — дата, другие 4 время, или дробная часть указывает время. Время в двух байтах можно держать даже точнее чем минуты 65536 div 1440 = 45 — ето значит, что можно держать с точностью чуть ли не до 5ти секунд. А выборка не усложняется, ты же сравниваешь 2 (или 4 если со временем) байта. Просто для каждой даты нужно повторить вычисление. -
23 сен 05по поводу никсового формата 4байта — 4294967296 вариаций
60*60*24*365=31536000, тогда 4294967296 div 31536000 = 136
Тогда это хуже y2k, все даты в ихсах ограничены 136 годами :) A DateTime — 8байт, потому, что учитываются мс. Кстати если ограничить
жизнь ноунэйм 136ю годами, то можно использовать и секунды, но будем верить в лучшее :)
-
-
Сделано с
NoNaMe