Mysql индекс по значениям!= 0
У меня есть большая таблица, которая содержит события. У большинства из них есть долгота + широта. Но некоторые этого не делают.
Когда я ищу список событий, я всегда включаю ГДЕ долготу!=0 И широту!=0
Возможно ли в индексе или каким-либо другим способом иметь предварительный фильтр, который бы избавлялся от не привязанных к геолокации событий.
PS: мне нужно сохранить эти не геолокационные события в моей таблице.
SELECT * FROM events WHERE start_time > NOW() AND latitude != 0 AND longitude != 0
2 ответа
В большинстве случаев индекс не влияет на производительность. Основная проблема заключается в избирательности. То есть, какая часть событий является геолокационной, а какая - нет.
При сканировании таблицы база данных должна прочитать все страницы. Одним из способов ускорения индекса является уменьшение количества страниц, которые необходимо прочитать. Но это может быть нелогичным. Если типичная запись составляет 80 байт, то на каждой странице поместится около 100. Таким образом, даже если только 5% событий находятся в географическом расположении, есть большая вероятность, что все страницы необходимо будет прочитать. Средняя страница будет иметь 5 таких записей. Другими словами, индекс не экономит много работы (и может даже вызывать больше работы, но это другая проблема).
Есть предостережения к этому. Создание индекса первичного ключа для таблицы с флагом "географическое расположение", поскольку первый элемент влияет на макет страницы. На всех страницах, кроме не более одной, будут только геолокационные записи или не геолокационные записи. Это обеспечит повышение производительности.
Для вашего конкретного запроса, лучший индекс, вероятно, events(start_time)
, Из-за select *
в любом случае запрос должен будет перейти на страницы данных для извлечения данных и может одновременно возвращать широту и долготу.
Я думаю, что лучший ответ здесь будет создать представление. Вы можете взаимодействовать с представлением почти так же, как с таблицей (INSERT, UPDATE, DELETE и т. Д.), Но вы можете выбрать подмножество этой таблицы для взаимодействия в представлении. Вот синтаксис создания:
CREATE VIEW [you view name] AS
SELECT * FROM events WHERE start_time > NOW() AND fblatitude != 0 AND fblongitude != 0