Ori*_*iol 1 sql sqlite performance sql-execution-plan
我有两张桌子
CREATE TABLE Categories (
Category INTEGER,
Id INTEGER,
FOREIGN KEY (Category) REFERENCES CategoriesInfo(Category)
)
CREATE TABLE 'CategoriesInfo' (
'Category' INTEGER PRIMARY KEY NOT NULL,
'Name' TEXT
)
Run Code Online (Sandbox Code Playgroud)
有索引
CREATE UNIQUE INDEX idxCategory ON Categories (Category, Id)
Run Code Online (Sandbox Code Playgroud)
如果我跑
EXPLAIN QUERY PLAN
SELECT CategoriesInfo.Category, Name
FROM Categories, CategoriesInfo
Where Categories.Category=CategoriesInfo.Category AND Id=:id
ORDER BY Name
Run Code Online (Sandbox Code Playgroud)
它说
Array
(
[0] => Array
(
[selectid] => 0
[order] => 0
[from] => 1
[detail] => SCAN TABLE CategoriesInfo (~1475 rows)
)
[1] => Array
(
[selectid] => 0
[order] => 1
[from] => 0
[detail] => SEARCH TABLE Categories USING COVERING INDEX idxCategory (Category=? AND Id=?) (~1 rows)
)
[2] => Array
(
[selectid] => 0
[order] => 0
[from] => 0
[detail] => USE TEMP B-TREE FOR ORDER BY
)
)
Run Code Online (Sandbox Code Playgroud)
但是如果我使用连接
EXPLAIN QUERY PLAN
SELECT CategoriesInfo.Category, CategoriesInfo.Name
FROM Categories
LEFT JOIN CategoriesInfo ON (Categories.Category=CategoriesInfo.Category)
WHERE Categories.Id=:id
ORDER BY Name
Run Code Online (Sandbox Code Playgroud)
我明白了
Array
(
[0] => Array
(
[selectid] => 0
[order] => 0
[from] => 0
[detail] => SEARCH TABLE Categories USING AUTOMATIC COVERING INDEX (Id=?) (~6 rows)
)
[1] => Array
(
[selectid] => 0
[order] => 1
[from] => 1
[detail] => SEARCH TABLE CategoriesInfo USING INTEGER PRIMARY KEY (rowid=?) (~1 rows)
)
[2] => Array
(
[selectid] => 0
[order] => 0
[from] => 0
[detail] => USE TEMP B-TREE FOR ORDER BY
)
)
Run Code Online (Sandbox Code Playgroud)
然后,使用连接应该更快.但是当我用phpliteadmin运行两个代码时,
为什么??
我会指出这两个查询不等同.
您的第一个查询有效地执行INNER JOIN,而您的第二个查询是LEFT JOIN.我打赌这是速度差异的原因.您的LEFT JOIN将要求所有来自Categories的记录都包含在输出中,这是您的第一个查询不需要的内容.
尝试将LEFT JOIN更改为INNER JOIN,然后比较速度.
归档时间: |
|
查看次数: |
77 次 |
最近记录: |