Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / У меня получается что индексы не ускоряют выборку...а наоборот / 25 сообщений из 30, страница 1 из 2
01.03.2016, 11:13
    #39182227
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
Имеется небольшая таблица расчет в которой 3 поля:
ни одно поле не индексировано.
таблица содержит 1000000 случайных записей,состоящих из чисел
в диапазоне от 1 до 999999
создаем запрос . суть которого в данной картинке

делаем серию запросов с индексом и без индекса
получаем результаты (в секундах)
без индекса с индексом
0,562 4,212
0,568 4,176
0,556 4,186
0,557 4,183
0,558 4,168

Вопрос: почему создание индекса не ускоряет запрос?
...
Рейтинг: 0 / 0
01.03.2016, 11:20
    #39182241
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
вот пример результата запроса с индексом
...
Рейтинг: 0 / 0
01.03.2016, 11:52
    #39182312
У меня получается что индексы не ускоряют выборку...а наоборот
avedeo,

какой именно создается индекс - предлагается угадать самостоятельно?
планы запросов, показывающие использование/неиспользование индекса где? или мы, как истинные джентльмены, верим друг другу на слово?
...
Рейтинг: 0 / 0
01.03.2016, 11:56
    #39182318
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
...
Рейтинг: 0 / 0
01.03.2016, 12:12
    #39182347
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
Добрый Э - Эх,
поле id-расчет автоинкрементное, первоначально предполагалось сделать индексом его,
но увы ...оказывается так нельзя делать..SQLiteman дал понять, что это неправильно
(я недавно ...с неделю только начал изучать SQLite), поэтому пришлось создать
индекс по полю "количество".
...
Рейтинг: 0 / 0
01.03.2016, 12:52
    #39182428
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
avedeo,

А почему не включить в индекс поле "цена", по нему также идёт отбор
...
Рейтинг: 0 / 0
01.03.2016, 13:26
    #39182480
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,
делал индексы и по двум полям "количество" и "цена"... но результат тот же.
...
Рейтинг: 0 / 0
01.03.2016, 13:44
    #39182512
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,
Только что добавил еще 1000000 записей...всего стало 2000000 записей,сделал 2 индекса
и вот результаты:
Выборка из 2000000 записей (в секундах)
при одном индексе при 2 индексах без индексов
9,68 .........................1,072.................0,972
9,315........................1,029.................1,057
9,312.........................1,032,,,,,,,,,,,,,,,,,1,049
9,321.........................1,063.................0,988
...
Рейтинг: 0 / 0
01.03.2016, 13:46
    #39182515
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
...
Рейтинг: 0 / 0
01.03.2016, 13:48
    #39182519
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
avedeo,

приложите определение таблицы, и немного тестовых данных (в виде insert into), попозже сгенерирую лям записей и попробуем выяснить, всё ли так оно выглядит
...
Рейтинг: 0 / 0
01.03.2016, 13:49
    #39182520
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
...
Рейтинг: 0 / 0
01.03.2016, 13:51
    #39182522
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
...
Рейтинг: 0 / 0
01.03.2016, 13:58
    #39182534
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,таблица заполнялась с помощью SQLiteStudio...
...
Рейтинг: 0 / 0
01.03.2016, 14:19
    #39182561
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,то что таблица содержит 2000000 записей...это точно
...
Рейтинг: 0 / 0
01.03.2016, 15:46
    #39182709
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
avedeo,

Можете приложить не скриншоты, а SQL? Перебивать с картинки нет большого желания
...
Рейтинг: 0 / 0
01.03.2016, 16:17
    #39182758
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,
-- создаем таблицу РАСЧЕТ

CREATE TABLE "расчет" (
"id-расчет" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"количество" REAL NOT NULL,
"цена" REAL NOT NULL
)

--создаем индексы

CREATE INDEX "индекс-общий" on расчет (количество ASC, цена ASC)

--создаем запрос на подсчет числа записей в таблице

select count(*) from расчет

-- создаем запрос на выборку из двух полей+вычисляемое поле

select *, количество*цена as сумма
from расчет
WHERE количество = '774'
OR цена = '161616'
group by количество,цена,сумма
order by сумма desc
...
Рейтинг: 0 / 0
01.03.2016, 17:09
    #39182824
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
avedeo,

У меня ваш запрос с вашей схемой отрабатывает: ~1500 мс
Ваш план:
selectidorderfromdetail000SCAN TABLE расчет USING COVERING INDEX индекс_общий000USE TEMP B-TREE FOR GROUP BY000USE TEMP B-TREE FOR ORDER BY
Ваш запрос:
Код: sql
1.
2.
3.
4.
5.
6.
select *, количество*цена as сумма 
from расчет 
WHERE количество = '774'
      OR цена = '161616'
group by количество,цена,сумма
order by сумма desc



Что делаю:
1) Убираем кавычки, т.к. у нас числа, а не текст. Получаем в среднем: 920 мс
2) Если добавить ваш индекс, то 853 мс
3) Удаляем ваш индекс и создаём два индекса по каждому полю. Получаем: 16 мс
CREATE INDEX idx_расчет_колво on расчет(количество)
CREATE INDEX idx_расчет_цена on расчет(цена)

Итоговый план:
selectidorderfromdetail000SEARCH TABLE расчет USING INDEX расчет_колво (количество=?)000SEARCH TABLE расчет USING INDEX расчет_цена (цена=?)000USE TEMP B-TREE FOR GROUP BY000USE TEMP B-TREE FOR ORDER BY
Запрос тот же, но без кавычек у значений.
Также смысл запроса и что он выдаёт, не особо понял, поэтому изменять и модифицировать не стал
...
Рейтинг: 0 / 0
01.03.2016, 17:27
    #39182855
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,
Спасибо, что изучили вопрос...смысл запросов в измерении скорости работы SQLite на моем компе
хотя бы в простых случаях, заметил, что в зависимости условия выборки сильно разнится время
меньше всего при условии =... больше всего время запроса при условии "не равно" <>...
ну это вполне объяснимо.
...
Рейтинг: 0 / 0
02.03.2016, 02:59
    #39183169
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
avedeo
А зачем тут такое странное использование group by?
...
Рейтинг: 0 / 0
02.03.2016, 09:19
    #39183252
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
Не улавливаю... в чем странность...я хочу видеть результат запроса именно в такой последовательности
притом довольно логичной скажем для документа типа например товарный чек: кол-во, цена, сумма.
Или вы имеете ввиду что GROUP BY ... стоит не на своем месте...да вроде тоже логично...группируем, потом сортируем.
...
Рейтинг: 0 / 0
02.03.2016, 10:29
    #39183328
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,
вообщем у меня получается, что без индексов база работает быстрее... и все
один и тот же запрос...условие и число не меняю
- с двумя индексами по двум полям -10,811; 10,864 секунды
- без индексов -3,831; 3,689 секунд
я понимаю, что так не должно быть...но увы...
...
Рейтинг: 0 / 0
02.03.2016, 10:40
    #39183340
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
Создал уникальный индекс по 3 полям...включая автоинкрементное
перед запросом переиндексировал...чтоб уж точно актуальный был

CREATE UNIQUE INDEX idx ON расчет ("id-расчет" ASC, количество ASC, цена ASC)

при тех же параметрах запроса результат( в секундах) 3,722; 3,655; 3,641
...
Рейтинг: 0 / 0
02.03.2016, 14:37
    #39183785
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
avedeo,

Я вам показал, у меня 2 млн отрабатывает за 16 мс, значит "один и тот же запрос" не есть один и тот же. Я надеюсь, вы убираете кавычки и индексы создали 2 разных индекса по 1 полю, а не 1 индекс с двумя полями
...
Рейтинг: 0 / 0
02.03.2016, 15:15
    #39183852
avedeo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
VSVLAD,
и кавычки убрал...и два индекса сделал отдельных

-- Описать IDX2
CREATE INDEX "idx2" on расчет (цена ASC)

-- Описать IDX1
CREATE INDEX "idx1" on расчет (количество ASC)

самому не нравятся такие результаты...но факты... упрямая вещь
...
Рейтинг: 0 / 0
02.03.2016, 19:41
    #39184228
MrCat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
У меня получается что индексы не ускоряют выборку...а наоборот
В WHERE два условия (на цену, на количество) через ИЛИ. Композитный индекс (кол-во, цена) хорошо сработает (при должной селективности) для условия на количество. Для условия на цену, добавленное через ИЛИ, он не сработает, и придётся делать полный перебор данных таблицы. "COVERING" в плане запроса означает, что для выдачи данных по запросу достаточно самого индекса (к таблице обращаться не нужно). Т.е. Covering index означает здесь не индексированный доступ, а всего лишь источник данных.

Попробуйте добавить в таблицу новое поле, не входящее в индекс. Движок мигом перестанет прикидываться шлангом и покажет SCAN TABLE в плане для "select *", а не USING INDEX!

--

И да, индексы - не панацея. Даже если сделать по индексу на каждое поле, то выигрыш по сравнению с полным перебором они дадут при высокой селективности каждого, и если каждое ИЛИ-условие в WHERE предполагает небольшую выборку.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / У меня получается что индексы не ускоряют выборку...а наоборот / 25 сообщений из 30, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]