在RPI上运行MySQL/优化查询

在RPI上运行MySQL/优化查询,mysql,sql,raspberry-pi,Mysql,Sql,Raspberry Pi,我有一个运行MySQL 5.5.57的raspberry PI 3-这是RPI上唯一运行的服务。 我的应用程序在下面进行一个关键查询,在MySQL服务器上执行该查询需要5-7秒 我在优化索引和FK方面做了很多工作,但确实没有多大帮助。当我进行解释时,我看到它使用的是临时和文件排序,这我真的不理解 在RPI上运行mysql时,是否应该进行任何配置调整。我对各种缓冲器不太了解。。。 我还应该做些什么来优化查询? 该表大约有30000行,并且正在增长 以下是查询: SELECT SQL_NO_CAC

我有一个运行MySQL 5.5.57的raspberry PI 3-这是RPI上唯一运行的服务。 我的应用程序在下面进行一个关键查询,在MySQL服务器上执行该查询需要5-7秒

我在优化索引和FK方面做了很多工作,但确实没有多大帮助。当我进行解释时,我看到它使用的是临时和文件排序,这我真的不理解

在RPI上运行mysql时,是否应该进行任何配置调整。我对各种缓冲器不太了解。。。 我还应该做些什么来优化查询? 该表大约有30000行,并且正在增长

以下是查询:

SELECT  SQL_NO_CACHE  distinct `photos`.* 
FROM `photos` 
LEFT OUTER JOIN `facets` ON `photos`.`id` = `facets`.`photo_id` 
WHERE (`photos`.`date_taken` <= '2017-08-24') 
AND (photos.status != 1 or photos.status is NULL) 
ORDER BY photos.date_taken DESC LIMIT 500 OFFSET 500;
当我对查询进行解释时,我得到的是:

+----+-------------+--------+-------+---------------------------------------------------+----------------------------+---------+-------------------+-------+----------------------------------------------+
| id | select_type | table  | type  | possible_keys                                     | key                        | key_len | ref               | rows  | Extra                                        |
+----+-------------+--------+-------+---------------------------------------------------+----------------------------+---------+-------------------+-------+----------------------------------------------+
|  1 | SIMPLE      | photos | range | index_photos_on_date_taken,index_photos_on_status | index_photos_on_date_taken | 9       | NULL              | 13147 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | facets | ref   | index_facets_on_photo_id                          | index_facets_on_photo_id   | 9       | pt_prod.photos.id |     1 | Using index; Distinct                        |
+----+-------------+--------+-------+---------------------------------------------------+----------------------------+---------+-------------------+-------+----------------------------------------------+
查询有时会扩展到:

SELECT  DISTINCT `photos`.* 
FROM `photos`  
LEFT OUTER JOIN `facets` ON `photos`.`id` = `facets`.`photo_id` 
LEFT OUTER JOIN `tags` ON `facets`.`source_id` = `tags`.`id` 
LEFT OUTER JOIN `comments` ON `facets`.`source_id` = `comments`.`id` 
WHERE `photos`.`date_taken` >= '2017-01-25' 
AND `photos`.`date_taken` <= '2018-01-10' 
AND `locations`.`country_id` = 16 
AND `locations`.`city_id` = 21 
OR `facets`.`source_id` = 9 AND `facets`.`type` = 'AlbumFacet'
OR `facets`.`source_id` = 9  AND `facets`.`type` = 'TagFacet'

这回答了问题的原始版本

您的查询仅使用第一个表中的列。我会这样写:

SELECT  SQL_NO_CACHE `photos`.* 
FROM `photos` p
LEFT OUTER JOIN `facets` ON `photos`.`id` = `facets`.`photo_id` 
WHERE (p.`date_taken` <= '2017-08-24') AND (NOT p.status <=> 1) AND
      EXISTS (SELECT 1 FROM facets f WHERE pid = f.photo_id)
ORDER BY p.date_taken DESC
LIMIT 500 OFFSET 500;
删除SELECT DISTINCT应该有点成功。您还应该在facetsphoto_id上有一个索引


关于日期的索引,状态可能会有所帮助。然而,目前还不清楚你的情况有多选择性,因此照片索引可能没有多大用处。

这回答了问题的原始版本

您的查询仅使用第一个表中的列。我会这样写:

SELECT  SQL_NO_CACHE `photos`.* 
FROM `photos` p
LEFT OUTER JOIN `facets` ON `photos`.`id` = `facets`.`photo_id` 
WHERE (p.`date_taken` <= '2017-08-24') AND (NOT p.status <=> 1) AND
      EXISTS (SELECT 1 FROM facets f WHERE pid = f.photo_id)
ORDER BY p.date_taken DESC
LIMIT 500 OFFSET 500;
删除SELECT DISTINCT应该有点成功。您还应该在facetsphoto_id上有一个索引


关于日期的索引,状态可能会有所帮助。但是,不清楚您的条件的选择性如何,因此照片上的索引可能没有多大用处。

您是否打算通过将其替换为EXISTS谓词来删除与facet的连接?我想是这样的,因为这样做半连接将允许您安全地删除DISTINCT修饰符。它确实显著加快了速度-达到0.033秒!我是通过rails应用程序来实现这一点的,我认为需要对activerecord进行一些修改才能实现这一点。这就是为什么我想在mysql端找到一个解决方案。您认为5秒的执行时间对于所描述的设置是否合理使用arel扩展activerecord以包含嵌套查询没有问题。但是,如果我需要用更多的条件扩展查询,该怎么办?请参阅我上面编辑的问题。@martin。在回答问题后编辑该问题是不礼貌的,因为这会使答案无效,而无效的答案会吸引选票。您是否打算通过将其替换为EXISTS谓词来删除与facets的联接?我想是这样的,因为这样做半连接将允许您安全地删除DISTINCT修饰符。它确实显著加快了速度-达到0.033秒!我是通过rails应用程序来实现这一点的,我认为需要对activerecord进行一些修改才能实现这一点。这就是为什么我想在mysql端找到一个解决方案。您认为5秒的执行时间对于所描述的设置是否合理使用arel扩展activerecord以包含嵌套查询没有问题。但是,如果我需要用更多的条件扩展查询,该怎么办?请参阅我上面编辑的问题。@martin。在问题被回答后编辑它是不礼貌的,因为这会使答案无效,而无效的答案会吸引选票。