gpt4 book ai didi

mysql - 不使用文件排序的慢 MySQL 查询

转载 作者:可可西里 更新时间:2023-11-01 07:29:22 24 4
gpt4 key购买 nike

我的主页上有一个查询,随着我的数据库表变大,它变得越来越慢。

表名 = tweets_cache行数 = 572,327

这是我当前使用的查询,速度很慢,超过 5 秒。

SELECT * FROM tweets_cache t WHERE t.province='' AND t.mp='0' ORDER BY t.published DESC LIMIT 50;

如果我取出 WHERE 或 ORDER BY,那么查询速度超快 0.016 秒。

我在 tweets_cache 表上有以下索引。

PRIMARY
published
mp
category
province
author

所以我不确定为什么不使用索引,因为 mp、provice 和 published 都有索引?对查询进行分析表明它没有使用索引对查询进行排序,而是使用了非常慢的文件排序。

possible_keys = mp,province
Extra = Using where; Using filesort

我尝试使用“profiles & mp”添加一个新的多列索引。 explain显示这个新索引列在“possible_keys”和“key”下,但是查询时间没有变化,仍然超过5秒。

这是关于查询的探查器信息的 screenshot

奇怪的是,我转储了我的数据库以在我的本地桌面上进行测试,这样我就不会搞砸实时站点。我本地的相同查询运行速度超快,几毫秒。因此,我将所有相同的 mysql 启动变量从服务器复制到我的本地,以确保没有某些设置可能导致此问题。但即使在那之后,本地查询运行得非常快,但实时服务器上的查询超过 5 秒。

我的数据库服务器只使用了它可用的 4GB 中的大约 800MB。这是我正在使用的相关 my.ini 设置

default-storage-engine = MYISAM
max_connections = 800
skip-locking
key_buffer = 512M
max_allowed_packet = 1M
table_cache = 512
sort_buffer_size = 4M
read_buffer_size = 4M
read_rnd_buffer_size = 16M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 128M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
# Disable Federated by default
skip-federated

key_buffer = 512M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

key_buffer = 512M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

MySQL 5.0.67

CREATE TABLE `tweets_cache` (                                                             
`id` bigint(11) unsigned NOT NULL default '0',
`published` int(11) NOT NULL default '0',
`title` varchar(140) NOT NULL,
`category` varchar(50) NOT NULL,
`type` varchar(30) NOT NULL,
`author` varchar(25) NOT NULL,
`author_full` varchar(150) NOT NULL,
`hash` varchar(50) NOT NULL,
`lastupdate` int(11) NOT NULL default '0',
`avatar` varchar(120) NOT NULL,
`mp` int(1) NOT NULL default '0',
`followers` int(10) NOT NULL default '0',
`province` varchar(2) NOT NULL,
`talkback` varchar(15) NOT NULL default '',
`in_reply_to_status_id` bigint(11) unsigned NOT NULL default '0',
`author_id` int(11) NOT NULL default '0',
`tracked` tinyint(1) NOT NULL default '0',
`geo` varchar(25) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `published` (`published`),
KEY `mp` (`mp`),
KEY `category` (`category`),
KEY `province` (`province`),
KEY `author` USING BTREE (`author`),
KEY `home` (`province`,`mp`,`published`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='InnoDB free: 275456 kB'

最佳答案

i'm not sure why its not using the indexes since mp, provice and published all have indexes?

MySQL 只会在整个表中使用一个索引。如果要在同一步骤中执行 WHERE 和 ORDER BY,请创建一个复合索引,左侧包含匹配条件,右侧包含排序条件,例如。在这种情况下 (province, mp, published)

关于ORDER BY optimisation .

关于mysql - 不使用文件排序的慢 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2761867/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com