|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
В общем. База: CREATE TABLE `ZAnuCu_OnuCAHuE`( `id` INTEGER PRIMARY KEY, `HAZBAHuE` TEXT ASC, `MODELb` TEXT, `KPATHOCTb` INTEGER, `DOCTynHIOCTb` INTEGER, `KAPTuHKA` TEXT, `KATEGOPuia` INTEGER, `PAZDEL` INTEGER, `OnuCAHuE` TEXT, `CTATyC` TEXT, `PEDAKTuPOBAHuE` TEXT); CREATE TABLE `ZAnuCu_KATEGOPuu`( `id` INTEGER ASC, `KATEGOPuia` INTEGER ASC, `PAZDEL` INTEGER ASC, `PEDAKTuPOBAHuE` TEXT); CREATE UNIQUE INDEX IF NOT EXISTS `uHDEKC_T_id` ON `ZAnuCu_OnuCAHuE` (`id`); CREATE INDEX IF NOT EXISTS `uHDEKC_T_HAZBAHuE` ON `ZAnuCu_OnuCAHuE` (`HAZBAHuE`); ZAnuCu_OnuCAHuE + колонки, которые генерируются при создании базы. Для скорости вытаскивания инфы. ~ 750 000 Записей KATEGOPuu - Какая запись, в какой категории лежит. Типо одна запись - несколько категорий. Раздел - для скорости добавлено ~ 1 000 000 Записей Тестовый запрос: SELECT t.`id`, t.`HAZBAHuE`, t.`MODELb`, t.`KPATHOCTb`, t.`DOCTynHIOCTb`, t.`KAPTuHKA`, t_k.`KATEGOPuia`, t.`KOLOHKA1239`, t.`KOLOHKA1267`, t.`KOLOHKA1272` FROM `ZAnuCu_OnuCAHuE` t, `ZAnuCu_KATEGOPuu` t_k WHERE t_k.`KATEGOPuia` IN (64, 2680 ... 'и так 579 категорий') AND t_k.`id` = t.`id` ORDER BY t.`HAZBAHuE` ASC LIMIT 0, 1000 Он выполняется за 7.5 секунды. Убираю "ORDER BY t.`HAZBAHuE`" - 50 милисекунд. Как заставить работать быстрее? При создании базы происходит: " GROUP BY `id` ORDER BY v.`name` ASC" - это записывает в базу SQLite, в которой я копаюсь(Таблицы выше приведены), и из неё пытаюсь выводить уже у себя локально данные. Т.е. пытаюсь ускорить максимально. Какие-нибудь предложения есть? Вроде всё в сортированном виде. Разве "ORDER BY t.`HAZBAHuE` ASC" не должно быстрее работать?(Мне нужна 100% гарантия, что все данные точно в алфавитном виде.) Причём происходит 2 запроса: 1 - я привёл. 2 - тоже группа категорий, но в обратном алфавитном порядке. Журнал отключен. База работает только на вывод. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 10:46 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
Причём выборка сначала идёт по "ZAnuCu_KATEGOPuu", т.е. никаких гарантий что по умолчанию мне выдадут "Отсортированные по алфавиту(название)" нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 11:10 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
47911, Индекс по сортируемому полю сделай и будет счастье! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 11:58 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
Уважаемый автор47911, Индекс по сортируемому полю сделай и будет счастье! А это разве не индекс: " CREATE INDEX IF NOT EXISTS `uHDEKC_T_HAZBAHuE` ON `ZAnuCu_OnuCAHuE` (`HAZBAHuE`);" ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 12:16 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
47911Уважаемый автор47911, Индекс по сортируемому полю сделай и будет счастье! А это разве не индекс: " CREATE INDEX IF NOT EXISTS `uHDEKC_T_HAZBAHuE` ON `ZAnuCu_OnuCAHuE` (`HAZBAHuE`);" ???Это индекс. Но у тебя идет выборка по фильтру id, соответственно и используется индекс на id. А два индекса одновременно использовать невозможно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 16:55 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
White Owl, Я вас понял. Тогда такой вопрос: у меня есть список категорий, из которых я хочу получить записи(Порядок их важен. По алфавиту, а не по id). Для примера, смотрите "Тестовый запрос" в 1 посту. Так вот. Я добился: чтобы товары шли без сортировки в алфавитном порядке(сразу в базе. Добавил в "ZAnuCu_KATEGOPuu" поле "Название товара" и его отсортировал на входе. Мне нужен алфавитный порядок в категориях, а не в таблице товаров. Т.е. у меня есть список категорий(отсортированный, не по id) и есть отсортированный список товаров(по названию)). А как мне сделать так, чтобы было: из категории "64 дай мне всё что есть, если меньше 1000 записей", "2680 дай мне всё что есть, если меньше 1000 записей" и так далее, но чтобы при достижении сумарного количества записей "в 1000 едениц" оно мне выдавало результат? Да. Я знаю: я люблю извращения. Но всёже? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 21:12 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
Ну сходу могу предложить поиграться с ручным заданием индексов. Код: sql 1. 2.
Но по хорошему, сортировать надо на клиенте. Вытягиваешь все что отфильтровалось в массив на клиенте и уже из этого массива отрисовываешь в нужной сортировке (там же и постраничное листание сделать будет проще и эффективней). ... |
|||
:
Нравится:
Не нравится:
|
|||
04.10.2017, 22:06 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
White OwlНу сходу могу предложить поиграться с ручным заданием индексов. Код: sql 1. 2.
Но по хорошему, сортировать надо на клиенте. Вытягиваешь все что отфильтровалось в массив на клиенте и уже из этого массива отрисовываешь в нужной сортировке (там же и постраничное листание сделать будет проще и эффективней). Дело в том, что на клиенте, запрос 1000 штук, с сортировкой(тестовый запрос) - 7.5 Планируется 20 000 000 уникальных записей и таблица категорий - минимум раза в 2 больше. А щас: 750 000 записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 04:56 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
47911, с сортировкой(тестовый запрос) - 7.5 - секунд выполняется. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.10.2017, 05:08 |
|
SQLite организация базы на скорость выборки(SELECT)
|
|||
---|---|---|---|
#18+
В общем вопрос решился таким запросом: индексация по колонкам, которым надо проводить сортировку; Колонки таблицы в количестве 10-20 штук; Не использовать программу "DB Browser for SQLite", т.к. в ней запрос выполняется больше по времени раз в 10.(при сортировке); и поиграться с настройками SQLite при соединении(соединились с базой, отправили настройки - после запрос.) В общем тестовый запорс в проге выполняется не более 0.5 секунды. А в "DB Browser for SQLite" - 6-7 секунд ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2017, 19:52 |
|
|
start [/forum/topic.php?fid=54&msg=39531107&tid=2008482]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 154ms |
0 / 0 |