0

在暂存环境中检索我的查询结果以反对使用我的本地主机时,我遇到了一个奇怪的事件

所以我连接了 8 个表,为了简单起见,查询如下:

SELECT
*
FROM
tsales, stores, vma_users, tracks, albums, fa_country, exchange_rates, outlets
WHERE tsales.type = 'T' 
AND stores.outlet_id = exchange_rates.outlet_id
AND stores.outlet_id = outlets.id
AND tsales.store_id = exchange_rates.outlet_id
AND tsales.sale_year = exchange_rates.year
AND tsales.sale_month = exchange_rates.month
AND tsales.currency = exchange_rates.currency
AND tsales.track_id = tracks.id
AND tracks.album_id = albums.id
AND tsales.country = fa_country.iso
AND tsales.account_id = vma_users.id
AND tsales.account_id = 2129
AND tsales.sale_year = 2013
AND tsales.sale_month = 3
ORDER BY tsales.id

(不用担心查询,我也有这个的左连接版本)

每当我在登台环境中运行此查询时,我可以检索结果,例如 26k 行,同时每当我在我的本地主机中运行它时,sql phpmyadmin 似乎什么也没发生,我什至无法得到结果,它会显示类似这样的内容

Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\apps\phpmyadmin3.4.10.1\libraries\session.inc.php on line 92 

我的 localhost 和 staging 的数据和结构是一样的。我刚刚更新了它。

你能帮我看看这是怎么回事。我知道这发生在大记录上,但我预计只有 26k 行,所以没关系。

使用 EXPLAIN 运行查询:

1   SIMPLE  outlets     ALL     NULL    NULL    NULL    NULL    46  Using temporary; Using filesort
1   SIMPLE  stores  ALL     NULL    NULL    NULL    NULL    55  Using where; Using join buffer
1   SIMPLE  fa_country  ALL     NULL    NULL    NULL    NULL    213     Using join buffer
1   SIMPLE  exchange_rates  ALL     NULL    NULL    NULL    NULL    1390    Using where; Using join buffer
1   SIMPLE  vma_users   ALL     NULL    NULL    NULL    NULL    3957    Using where; Using join buffer
1   SIMPLE  albums  ALL     NULL    NULL    NULL    NULL    78458   Using join buffer
1   SIMPLE  tsales  ALL     NULL    NULL    NULL    NULL    893483  Using where; Using join buffer
1   SIMPLE  tracks  eq_ref  PRIMARY,album_id    PRIMARY     4   valleyarm_digital.tsales.track_id   1   Using where
4

1 回答 1

0

在这里用专业指南回答我自己的问题。

获取针对 staging development 和 localhost 的查询结果的差异发生是因为在 localhost 中导入 sql 文件时它会丢失索引,第一印象是它也会复制索引,但您需要重新创建从 staging 到 localhost 的整个模式。

Mysql Indexes中所述, MySQL 可以快速确定要在数据文件中间寻找的位置,而无需查看所有数据。

因此,如果不使用索引,它最终会进行完整扫描,从而导致无法检索结果。

于 2013-10-01T08:31:04.453 回答