Mariadb查询(加入)不使用索引

时间:2016-02-10 06:20:13

标签: mysql sql performance mariadb

当我执行简单查询时,例如以下内容:

SELECT `visits`.`item_id`, `visits`.`hits` FROM `visits` ORDER BY `visits`.`hits` DESC LIMIT 10;

嗯,它有效并允许我检索表visits中的前十行。 但是,当我加入一个表来检索我需要的信息时,需要花费更多的时间(> 1s),这是我的工作方式:

SELECT `visits`.`item_id`, `visits`.`hits`, `item`.`id`, `item`.`title`, `item`.`url` FROM `visits`
INNER JOIN `item` ON `visits`.`item_id`=`item`.`id`
ORDER BY `visits`.`hits` DESC
LIMIT 10;

嗯,它完成了这项工作,但需要一秒多的时间才能得出结果。我用解释运行查询,它说:

id: simple
select_type: simple
table item
type ALL
possible_keys PRIMARY
key NULL
key_len NULL
ref NULL
Rows 4735
Extra Using temporary, using filesort

id: simple
select_type: simple
table visits
type ref
possible_keys visits_item_id
key visits_item_id
key_len 4
ref item.item_id
Rows 8
Extra 

我这里没有专家,但我认为查询并非使用itemitem_id上的索引来查找item。而且我不知道如何让这个查询运行得更快。有任何想法吗?任何帮助都将非常感谢,谢谢!

两个表的

CREATE TABLE语句:

 CREATE TABLE `visits`(
`id` int(11) NOT NULL AUTO_INCREMENT,
`item_id` int(11) NOT NULL,
`hits` int(11) NOT NULL,
KEY `visits_item_id` (`item_id`)
KEY `hits` (`hits`)
CONSTRAINT `visits_ibfk_1` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=99427 DEFAULT CHARSET=utf8

CREATE TABLE `item` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL,
`url` varchar(255) NOT NULL
PRIMARY Key(`id`)) ENGINE=InnoDB AUTO_INCREMENT=6287 DEFAULT CHARSET=utf8

更多信息我使用peewee创建了这些表格。在使用Peewee创建表格后,我在visitshits上创建了索引。

**显示个人资料:运行SET PROFILING=1; **

+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000106 |
| checking permissions | 0.000008 |
| checking permissions | 0.000003 |
| checking permissions | 0.000002 |
| checking permissions | 0.000004 |
| Opening tables       | 0.000028 |
| After opening tables | 0.000007 |
| System lock          | 0.000006 |
| Table lock           | 0.000004 |
| After opening tables | 0.000006 |
| init                 | 0.000037 |
| optimizing           | 0.000033 |
| statistics           | 0.000075 |
| preparing            | 0.000049 |
| executing            | 0.000005 |
| Copying to tmp table | 0.000510 |
| Copying to tmp table | 0.813779 |
| Sorting result       | 0.027571 |
| Sending data         | 0.000040 |
| end                  | 0.000004 |
| removing tmp table   | 0.000298 |
| end                  | 0.000005 |
| query end            | 0.000005 |
| closing tables       | 0.000013 |
| freeing items        | 0.000007 |
| updating status      | 0.000020 |
| cleaning up          | 0.000005 |
+----------------------+----------+

1 个答案:

答案 0 :(得分:0)

每个InnoDB表必须具有PRIMARY KEY,最好明确指定。您有AUTO_INCREMENTs - 也可以将它们设为PRIMARY KEY

您是否需要SELECT列表中的这两个;他们是一样的吗?.. visitsitem_iditemid