В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.
При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.
Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».
Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this
. Возьмем этот пример:
public class Some {
private int id;
public int getId(){
return this.id;
}
public setId( int newId ) {
this.id = newId;
}
}
И в другом месте вашего кода:
Some reference = new Some(); // Point to a new object of type Some()
Some otherReference = null; // Initiallly this points to NULL
reference.setId( 1 ); // Execute setId method, now private var id is 1
System.out.println( reference.getId() ); // Prints 1 to the console
otherReference = reference // Now they both point to the only object.
reference = null; // "reference" now point to null.
// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );
// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...
Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference
и otherReference
оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.
Если я помню правильно, который выполнит целое сканирование таблицы, потому что Вы передаете столбец через функцию. MySQL покорно выполнит функцию для каждого столбца, обходя индекс, так как оптимизатор запросов не может действительно знать результаты функции.
то, Что я сделал бы, является чем-то как:
SELECT * FROM transactionlist
WHERE TranDateTime BETWEEN '2008-08-17' AND '2008-08-17 23:59:59.999999';
, Который должен дать Вам все, что произошло 17.08.2008.
Я не означаю звучать милым, но простой путь состоял бы в том, чтобы добавить новый столбец, который только содержал часть даты и индекс на этом.
Вы не можете создать индекс на просто части даты. Существует ли причина, к которой Вы имеете?
, Даже если бы Вы могли бы создать индекс на просто части даты, оптимизатор, вероятно, все еще не использовал бы ее для вышеупомянутого запроса.
я думаю, что Вы найдете, что
SELECT * FROM transactionlist WHERE TranDateTime BETWEEN '2008-08-17' AND '2008-08-18'
эффективно и делает то, что Вы хотите.
Я не знаю о специфических особенностях mySql, но каков вред в просто индексации поля даты в целом?
Тогда просто поиск:
select * from translist
where TranDateTime > '2008-08-16 23:59:59'
and TranDateTime < '2008-08-18 00:00:00'
, Если индексы являются B-деревьями или чем-то еще, которое это разумно, они должны быть найдены быстро.
Valeriy Kravchuk на запросе новых функций для этой самой проблемы о сайте MySQL сказал для использования этого метода.
"Тем временем можно использовать символьные столбцы для хранения значений ДАТЫ И ВРЕМЕНИ как строки только с первыми индексируемыми символами N. С некоторым тщательным использованием триггеров в MySQL 5 можно создать довольно надежное решение на основе этой идеи".
Вы могли записать стандартную программу, довольно легкую добавить, что этот столбец, и затем с триггерами сохраняет этот столбец синхронизировавшим. Индекс на этом строковом столбце должен быть довольно быстрым.
Что действительно 'объясняет', говорят? (выполненный ОБЪЯСНЯЮТ ВЫБОР * ОТ transactionlist, где дата (TranDateTime) = '2008-08-17')
, Если это не использует Ваш индекс из-за даты () функция, запрос диапазона, должен работать быстро:
ВЫБОР * ОТ transactionlist, где TranDateTime> = '2008-08-17' И TranDateTime < '2008-08-18'
Вместо того, чтобы делать индекс на основе функции (если это даже возможно в mysql) делают Ваш, где пункт делает сравнение диапазона. Что-то как:
, Где TranDateTime> '17.08.2008 0:00:00' и TranDateTime < '17.08.2008 11:59:59')
Это позволяет DB использовать индекс на TranDateTime (существует один, правильно?), чтобы сделать выбор.
Я не знаю специфики mySQL, но какой вред от простой индексации поля даты целиком?
Если вы используете функциональную магию для * деревьев, хэшей, ... исчезнет, потому что для для получения значений необходимо вызвать функцию. Но, поскольку вы не знаете результатов, вам нужно провести полное сканирование таблицы.
Добавить нечего.
Может быть, вы имеете в виду что-то вроде вычисленных (вычисленных?) Индексов ... но на сегодняшний день я видел это только в Intersystems Caché. Я не думаю, что это дело в реляционных базах данных (AFAIK).
Хорошим решением, на мой взгляд, является следующее (обновленный пример clintp):
SELECT * FROM translist
WHERE TranDateTime >= '2008-08-17 00:00:00.0000'
AND TranDateTime < '2008-08-18 00:00:00.0000'
Используете ли вы 00: 00: 00.0000
или 00:00
по моему мнению не имеет значения (я обычно использовал его в этом формате).