Должен ли я создать индекс по столбцам, если их значения используются в функциях? (SQLite) - PullRequest
0 голосов
/ 19 июля 2010

Я работаю с огромной базой данных и пытаюсь оптимизировать ее.

Мне было интересно, если он внесет какие-либо изменения, чтобы проиндексировать значения, которые используются в качестве критериев в запросе, но через функцию.

Например, у меня есть эта таблица координат GPS:

-Node (#id,lat,lng)

и этот запрос:

SELECT * FROM Node WHERE distance( lat, lng, $lat, $lng ) < $threshold

Будет ли создание индекса для lat и lng какой-либо оптимизацией? (Я работаю с SQLite)

Спасибо

Редактировать Я только что подумал над тем же вопросом, но если я сделаю вычисление напрямую, как:

SELECT * FROM Node WHERE (lat-$lat)*(lat-$lat) + (lng-$lng)*(lng-$lng)  < $threshold

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Для запросов вы наверняка увидите выигрыш в производительности.

Но с большой базой данных вы также столкнетесь с падением производительности при вставках.

1 голос
/ 20 июля 2010

База данных должна будет рассчитать расстояние для каждого узла в вашем примере и не получит выгоду от индекса. Однако если вы индексируете столбцы lng и lat и используете их для первого удаления всех узлов, которые имеют порог abs (lat - $ lat)> $ threshold или abs (lng - $ lng)> $, вы можете увидеть повышение производительности, поскольку база данных используйте созданный индекс, чтобы исключить количество записей, прежде чем вычислять расстояние для оставшихся записей.

Запрос будет выглядеть примерно так:

SELECT * FROM Node 
WHERE lat >= $lat - $threshold
AND lat <= $lat + $threshold
AND lng >= $lng - $threshold
AND lng <= $lng + $threshold
AND distance( lat, lng, $lat, $lng )  < $threshold;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...