Как каждый создает индекс в день часть поля DATETIME в MySql

В 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 освободит память, используемую этим объектом, и выделит другую.

67
задан fancyPants 2 March 2015 в 12:32
поделиться

8 ответов

Если я помню правильно, который выполнит целое сканирование таблицы, потому что Вы передаете столбец через функцию. MySQL покорно выполнит функцию для каждого столбца, обходя индекс, так как оптимизатор запросов не может действительно знать результаты функции.

то, Что я сделал бы, является чем-то как:

SELECT * FROM transactionlist 
WHERE TranDateTime BETWEEN '2008-08-17' AND '2008-08-17 23:59:59.999999';

, Который должен дать Вам все, что произошло 17.08.2008.

63
ответ дан Michel de Ruiter 24 November 2019 в 14:41
поделиться

Я не означаю звучать милым, но простой путь состоял бы в том, чтобы добавить новый столбец, который только содержал часть даты и индекс на этом.

11
ответ дан Mike Tunnicliffe 24 November 2019 в 14:41
поделиться

Вы не можете создать индекс на просто части даты. Существует ли причина, к которой Вы имеете?

, Даже если бы Вы могли бы создать индекс на просто части даты, оптимизатор, вероятно, все еще не использовал бы ее для вышеупомянутого запроса.

я думаю, что Вы найдете, что

SELECT * FROM transactionlist WHERE TranDateTime BETWEEN '2008-08-17' AND '2008-08-18'

эффективно и делает то, что Вы хотите.

9
ответ дан MarkR 24 November 2019 в 14:41
поделиться

Я не знаю о специфических особенностях mySql, но каков вред в просто индексации поля даты в целом?

Тогда просто поиск:

 select * from translist 
     where TranDateTime > '2008-08-16 23:59:59'
        and TranDateTime < '2008-08-18 00:00:00'

, Если индексы являются B-деревьями или чем-то еще, которое это разумно, они должны быть найдены быстро.

4
ответ дан Clinton Pierce 24 November 2019 в 14:41
поделиться

Valeriy Kravchuk на запросе новых функций для этой самой проблемы о сайте MySQL сказал для использования этого метода.

"Тем временем можно использовать символьные столбцы для хранения значений ДАТЫ И ВРЕМЕНИ как строки только с первыми индексируемыми символами N. С некоторым тщательным использованием триггеров в MySQL 5 можно создать довольно надежное решение на основе этой идеи".

Вы могли записать стандартную программу, довольно легкую добавить, что этот столбец, и затем с триггерами сохраняет этот столбец синхронизировавшим. Индекс на этом строковом столбце должен быть довольно быстрым.

2
ответ дан Ray Jenkins 24 November 2019 в 14:41
поделиться

Что действительно 'объясняет', говорят? (выполненный ОБЪЯСНЯЮТ ВЫБОР * ОТ transactionlist, где дата (TranDateTime) = '2008-08-17')

, Если это не использует Ваш индекс из-за даты () функция, запрос диапазона, должен работать быстро:

ВЫБОР * ОТ transactionlist, где TranDateTime> = '2008-08-17' И TranDateTime < '2008-08-18'

0
ответ дан nathan 24 November 2019 в 14:41
поделиться

Вместо того, чтобы делать индекс на основе функции (если это даже возможно в mysql) делают Ваш, где пункт делает сравнение диапазона. Что-то как:

, Где TranDateTime> '17.08.2008 0:00:00' и TranDateTime < '17.08.2008 11:59:59')

Это позволяет DB использовать индекс на TranDateTime (существует один, правильно?), чтобы сделать выбор.

0
ответ дан Justsalt 24 November 2019 в 14:41
поделиться

Я не знаю специфики 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 по моему мнению не имеет значения (я обычно использовал его в этом формате).

1
ответ дан 24 November 2019 в 14:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: