就整体性能而言,这三个索引可能会过大,并且在插入时会产生不利影响,因为要维护三个索引以及额外的内存/空间利用率。
但是,第一个因素是确定是否实际使用索引,这取决于要运行的查询。
从使用以下代码的简短游戏中,您可以将其用作更全面探索的基础(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 和 USE TEMP B-TREE FOR ORDER BY
- 只有第一个索引 SCAN TABLE my_table USING INDEX index_time 和 USE TEMP B-TREE FOR RIGHT PART OF ORDER BY。
- 使用第一个和第二个 SCAN TABLE my_table USING INDEX index_time 和 USE TEMP B-TREE FOR RIGHT PART OF ORDER BY。
- 只有第二个 SCAN TABLE my_table 和 USE TEMP B-TREE FOR ORDER BY
- 所有 3 个 SCAN TABLE my_table USING INDEX index_time 和 USE TEMP B-TREE FOR RIGHT PART OF ORDER BY
- 只有第三个 SCAN TABLE my_table 和 USE TEMP B-TREE FOR ORDER BY
第四次查询
- 没有任何 SCAN TABLE my_table 和 USE TEMP B-TREE FOR ORDER BY
- 有 1 个 SCAN TABLE my_table 和 USE TEMP B-TREE FOR ORDER BY
- 使用 1 和 2 SCAN TABLE my_table USING INDEX index_name 和 USE TEMP B-TREE FOR RIGHT PART OF ORDER BY
- 有 2 个 SCAN TABLE my_table USING INDEX index_name 和 USE TEMP B-TREE FOR RIGHT PART OF ORDER BY
- 使用 1,2 和 3 扫描表 my_table USING INDEX index_name_and_time
- 只有 3 个 SCAN TABLE my_table USING INDEX index_name_and_time
当然,这不考虑时间,因为桌子是空的。上面的代码可以很容易地适应包含数据,因此可以应用时间。请注意,您可能还需要考虑运行查询以外的影响,例如会改变索引的插入和删除。
答案 - 视情况而定。
因此,至少从索引利用率的角度来看,索引是否有用取决于所使用的查询。