【发布时间】:2019-12-02 16:10:35
【问题描述】:
我正在创建一个 PHP 后端 API,它在 MySQL 数据库上执行查询。这是查询:
SELECT * FROM $TABLE_GAMES WHERE
($GAME_RECEIVERID = '$userId'OR $GAME_OTHERID = '$userId')
ORDER BY $GAME_ID LIMIT 1"
本质上,我将 $userId 作为参数传递,并获取具有最小 $GAME_ID 值的行,对于表中有大约 30 000 个匹配行的用户,它将在不到 100 毫秒的时间内返回结果。但是,我后来添加了新用户,这些用户的匹配行大约不到 100 行,而且查询速度对他们来说非常慢,每次大约需要 20-30 秒。
我很困惑为什么查询在应该返回少量行的情况下会慢得多,而在返回大量行时却非常快,尤其是因为我有ORDER BY。
我已经阅读过有关参数嗅探的信息,但据我所知,那是 SQL 服务器的东西,我正在使用 MySQL。
编辑
这是SHOW CREATE 声明:
CREATE TABLEgames(
IDint(11) NOT NULL AUTO_INCREMENT,
SenderIDint(11) NOT NULL,
ReceiverIDint(11) NOT NULL,
OtherIDint(11) NOT NULL,
Timestamptimestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (ID)
) ENGINE=MyISAM AUTO_INCREMENT=17275279 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
这是EXPLAIN的输出
+----+-------------+-------+------+---------------+------+---------+-----+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | extra |
+----+-------------+-------+------+---------------+------+---------+-----+------+-------+
| 1 | SIMPLE | games | NULL | index | NULL | PRIMARY | 4 | NULL | 1 |
+----+-------------+-------+------+---------------+------+---------+-----+------+-------+
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE games NULL index NULL PRIMARY 4 NULL 1 19.00 Using where
我尝试了准备好的语句,但仍然得到相同的结果。
对不起,格式不好,我还是菜鸟。
【问题讨论】:
-
查看准备好的和绑定的查询
-
请edit您的问题向我们展示您的表的定义;即
SHOW CREATE TABLE的输出。我们可能会建议您添加索引。而且,请澄清:您向我们展示的查询仅返回一行。你说它可以返回 30K 行;是来自不同的查询吗? -
那些索引不会帮助查询任何内容。
标签: php mysql sql query-performance