Что касается общей производительности, три индекса могут быть излишними и иметь пагубные последствия при вставке, так как есть три индекса для поддержки и дополнительное использование памяти / пространства.
Однако первый фактор будетчтобы выяснить, будут ли индексы фактически использоваться, это зависит от того, какие запросы должны быть выполнены.
Из краткой игры со следующим кодом, который вы могли бы использовать в качестве основы для более полного изучения (EXPLAIN QUERY PLAN your_query
существоинструмент для использования): -
DROP TABLE IF EXISTS my_table;
DROP INDEX IF EXISTS index_time;
DROP INDEX IF EXISTS index_name;
DROP INDEX IF EXISTS index_name_and_time;
CREATE TABLE IF NOT EXISTS my_table (time INTEGER, name TEXT, other TEXT);
CREATE INDEX IF NOT EXISTS index_time ON my_table (time); -- INDEX 1
-- CREATE INDEX IF NOT EXISTS index_name ON my_table (name); -- INDEX 2
-- CREATE INDEX index_name_and_time ON my_table (name,time); -- INDEX 3
EXPLAIN QUERY PLAN
SELECT * FROM my_table; -- QUERY 1
-- EXPLAIN QUERY PLAN
-- SELECT time, name, other FROM my_table -- QUERY 2
-- EXPLAIN QUERY PLAN
-- SELECT time, name, other FROM my_table ORDER BY time, name; -- QUERY 3
-- EXPLAIN QUERY PLAN
-- SELECT time, name, other FROM my_table ORDER BY name, time; -- QUERY 4
Можно получить следующие результаты: -
Первые два запроса, никаких преимуществ, просто недостаток.
Отсутствие индексов черезналичие всех 3 не имеет значения для первых 2 запросов (в основном, то же самое). Ни один из индексов не используется, когда доступны индексы 0,1,2 или 3. Они используют SCAN TABLE my_table
Третий запрос
- Без индексов SCAN TABLE my_table и ИСПОЛЬЗОВАТЬ TEMP B-TREE ДЛЯ ЗАКАЗА НА
- Только с первым индексом SCAN TABLE my_table ИСПОЛЬЗОВАТЬ ИНДЕКСindex_time и ИСПОЛЬЗОВАТЬ ТЕМП. B-ДЕРЕВО ДЛЯ ПРАВИЛЬНОЙ ЧАСТИ ЗАКАЗА ПО .
- С 1-м и 2-м СТОЛБАМИ СКАНИРОВАНИЯ my_table ИСПОЛЬЗОВАНИЕ INDEX index_time и ИСПОЛЬЗУЙТЕ ТЕМП. B-ДЕРЕВО ДЛЯ ПРАВИЛЬНОЙ ЧАСТИ ЗАКАЗА ПО .
- , используя всего 2 СТОЛ ДЛЯ СКАНИРОВАНИЯ my_table и ИСПОЛЬЗУЙТЕ ТЕМП. B-ДЕРЕВО ДЛЯ ЗАКАЗА ПО *
- Со всеми 3 СТОЛ ДЛЯ СКАНИРОВАНИЯ my_table ИСПОЛЬЗОВАНИЕ INDEX index_time и ИСПОЛЬЗОВАНИЕ ТЕМПЕРАТУРЫ B-TREE ДЛЯ ПРАВОЙ ЧАСТИ ЗАКАЗА ПО *
- Только с 3-м SCAN TABLE my_table и ИСПОЛЬЗОВАТЬ T-TEP B-TREE ДЛЯ ЗАКАЗА ПО
4-й запрос
- Без каких-либо SCAN TABLEmy_table и ИСПОЛЬЗОВАТЬ B-ДЕРЕВО TEMP ДЛЯ ЗАКАЗА ПО
- С 1 СТОЛ ДЛЯ СКАНИРОВАНИЯ my_table и ИСПОЛЬЗОВАТЬ B-ДЕРЕВО TEMP ДЛЯ ЗАКАЗА
- с 1 и 2 ТАБЛИЦА СКАНИРОВАНИЯ my_table ИСПОЛЬЗОВАНИЕ ИНДЕКСА index_name и ИСПОЛЬЗОВАНИЕ ТЕМПЕРАТУРЫ B-ДЕРЕВА ДЛЯ ПРАВОЙ ЧАСТИ ЗАКАЗА ПО
- С 2 SCAN TABLE my_table ИСПОЛЬЗОВАНИЕ INDEX index_name и ИСПОЛЬЗОВАНИЕ ТЕМПЕРАТУРЫ B-TREE ДЛЯ ПРАВОЙ ЧАСТИ ЗАКАЗА ПО
- С 1,2 и 3 SCAN TABLE my_table ИСПОЛЬЗОВАНИЕ INDEX index_name_and_time
- Всего 3 ТАБЛИЦА СКАНИРОВАНИЯ my_table ИСПОЛЬЗОВАНИЕ INDEX index_name_and_time
Конечно, это не учитывает время, так как таблицы пусты.Приведенный выше код можно легко адаптировать для включения данных и, таким образом, применять тайминги.Обратите внимание, что вы также, возможно, рассмотрите другие эффекты, помимо выполнения запросов, такие как вставки и удаления, которые могут изменить индексы.
Ответ - зависит.
Так что, по крайней мере, отС точки зрения использования индекса совершенно очевидно, что индекс полезен или нет, зависит от используемых запросов.