8

我已经让 mysql 解释了以下查询:

SELECT carid,pic0,bio,url,site,applet 
FROM cronjob_reloaded 
WHERE 
carid LIKE '%bmw%' 
OR 
carid LIKE '%mer%' 
OR 
age BETWEEN '5' AND '10' 
OR 
category IN ('used') 
ORDER BY CASE 
    WHEN carid LIKE '%bmw%' OR carid LIKE '%mer%' THEN 1 
    WHEN age BETWEEN '5' AND '10' THEN 2 
    ELSE 3 
END 

这是解释结果:

EXPLAIN SELECT carid, pic0, bio, url, site, applet
FROM cronjob_reloaded
WHERE carid LIKE '%bmw%'
OR carid LIKE '%mer%'
OR carid IS NOT NULL
AND age
BETWEEN '5'
AND '10'

我不明白的是:

在此处输入图像描述

  1. 为什么键为NULL?

  2. 我可以让这个查询更快吗?它需要 0.0035 秒 - 对于 1000 行表来说,这是慢还是快?

在我的表中 carid 是表的主键。

4

2 回答 2

3

MySQL 没有找到用于查询的任何索引。

查询的速度取决于您的 CPU,对于这么少的行,还取决于可用的 RAM、系统负载和磁盘速度。您可以使用BENCHMARK多次运行查询并以更高的精度对其计时(例如,您执行 100,000 次并将总时间除以 100,000)。

至于索引问题:您的WHERE子句涉及carid, age, category(间接地performerid)。您应该首先索引category(因为您要求直接匹配),age最后是carid

CREATE INDEX test_index ON cronjob_reloaded ( category, age, carid );

这汇集了 MySQLWHERE在单个索引操作中查询阶段所需的大部分信息。

添加performerid可能会加快速度,也可能不会,这取决于几个因素。我会开始没有,也许稍后会测试它。

更新:原始查询似乎已更改,不再performerid出现。

最后,1000 行通常只需要很少的时间,以至于 MySQL 甚至可能决定根本不使用索引,因为它更快地加载所有内容并WHERE自行排序。

于 2012-09-12T14:33:18.220 回答
2

As per the docs:

"If key is NULL, MySQL found no index to use for executing the query more efficiently."

Please refer below link for Official document on it.

Mysql Doc

Edit :

Here are the links for Index

How mysql Index work's - SO

How to create index

Hope this help !

于 2012-09-12T14:27:08.313 回答