【发布时间】:2012-08-12 14:40:20
【问题描述】:
我正在尝试通过创建索引来优化 SQL 查询以获得最佳性能。
表定义
CREATE TABLE Mots (
numero INTEGER NOT NULL,
fk_dictionnaires integer(5) NOT NULL,
mot varchar(50) NOT NULL,
ponderation integer(20) NOT NULL,
drapeau varchar(1) NOT NULL,
CONSTRAINT pk_mots PRIMARY KEY(numero),
CONSTRAINT uk_dico_mot_mots UNIQUE(fk_dictionnaires, mot),
CONSTRAINT fk_mots_dictionnaires FOREIGN KEY(fk_dictionnaires) REFERENCES Dictionnaires(numero)
);
索引定义
CREATE INDEX idx_dictionnaires ON mots(fk_dictionnaires DESC);
CREATE INDEX idx_mots_ponderation ON mots(ponderation);
CREATE UNIQUE INDEX idx_mots_unique ON mots(fk_dictionnaires, mot);
SQL 查询:
SELECT numero, mot, ponderation, drapeau
FROM mots
WHERE mot LIKE 'ar%'
AND fk_dictionnaires=1
AND LENGTH(mot)>=4
ORDER BY ponderation DESC
LIMIT 5;
查询计划
0|0|0|SEARCH TABLE mots USING INDEX idx_dictionnaires (fk_dictionnaires=?) (~2 rows)
0|0|0|USE TEMP B-TREE FOR ORDER BY
定义的索引似乎没有被使用并且查询持续(根据.timer):
CPU Time: user 0.078001 sys 0.015600
但是,当我删除 fk_dictionnaires=1.我的索引使用正确,性能在 0.000000-0.01XXXXXX 秒左右
0|0|0|SCAN TABLE mots USING INDEX idx_mots_ponderation (~250000 rows)
我在 stackoverflow 上发现了一些类似的问题,但没有帮助我。
如何通过使用索引或/和更改 SQL 查询来提高性能? 提前致谢。
【问题讨论】:
-
你试过在
mots(mot, fk_dictionnaires)上建立索引吗? -
是的,我目前在这两个字段上有一个索引。
mots(mot, fk_dictionnaires)与mots(fk_dictionnaires, mot)不同? -
尝试按该顺序而不是
mots(fk_dictionnaires, mot)的索引,如果您的大部分记录都设置为相同的fk_dictionnaires值,这可能会产生重大影响 -
我更改了字段顺序,但没有发现任何差异。处理时间相同,使用新索引
mots(fk_dictionnaires, mot)。
标签: sql performance optimization indexing