Можно ли оптимизировать этот запрос выбора на мобильном устройстве? - PullRequest
1 голос
/ 12 февраля 2010

У нас есть мобильное приложение на C # с базой данных SQLite. У нас есть большая база данных инвентаря, такая как 30k или 100k предметов. Файл базы данных занимает 12 МБ на карте флэш-памяти.

Выполнение более простого запроса SELECT с ограничением занимает 10-15 секунд.

select id,invitem,invid,cost from inventory 
   where itemtype = 1 and 
   (invitem like '%5204d%' or invid like '%5204d%') 
   limit 25

иногда категория тоже включена,

select id,invitem,invid,cost from inventory 
   where itemtype = 1 and 
   categoryid=147 and 
   (invitem like '%5204d%' or invid like '%5204d%')  
   limit 25

Индексы созданы на:

cmd.CommandText = "CREATE INDEX IF NOT EXISTS idx_inventory_categoryid ON " + this.TableName + " (categoryid);";
cmd.ExecuteNonQuery();

cmd.CommandText = "CREATE INDEX IF NOT EXISTS idx_inventory_itemtype ON " + this.TableName + " (itemtype);";
cmd.ExecuteNonQuery();

cmd.CommandText = "CREATE INDEX IF NOT EXISTS idx_inventory_invitem ON " + this.TableName + " (invitem);";
cmd.ExecuteNonQuery();

Эти два поля в Like - это VARCHAR, остальные - числовые.

Можно ли оптимизировать этот запрос выбора на мобильном устройстве?

Ответы [ 2 ]

1 голос
/ 12 февраля 2010

Проблема в начальном% в предложении where..like. Индекс нельзя использовать в этом запросе, поэтому сканирование таблицы - единственный способ сделать это. Добавление идентификатора категории поможет - по крайней мере, он может использовать этот индекс.

0 голосов
/ 12 февраля 2010

Вы можете использовать EXPLAIN, чтобы проверить, действительно ли используются индексы. Я бы предположил, что подстановочный знак в начале like '%5204d%' запрещает любое использование индексов на invitem.

...