我正在开发一家仅通过贷款销售产品的电子商店。我在任何类别中每页显示 10 个产品,每个产品有 3 个不同的价格标签 - 3 种不同的贷款类型。测试期间一切顺利,查询执行时间完美,但今天将更改传输到生产服务器时,站点在大约 2 分钟内“崩溃”。用于选择贷款类型的查询有时会挂起约 10 秒,并且经常发生,因此无法跟上,而且速度很慢。用于存储数据的表有大约 200 万条记录,每个选择如下所示:
SELECT *
FROM products_loans
WHERE KOD IN("X17/Q30-10", "X17/12", "X17/5-24")
AND 369.27 BETWEEN CENA_OD AND CENA_DO;
3 种贷款类型和价格需要在 CENA_OD 和 CENA_DO 之间的范围内,因此返回 3 行。
但由于我需要每页显示 10 个产品,我需要使用OR通过修改后的选择来运行它,因为我没有找到任何其他解决方案。我在这里问过,但没有得到答案。正如参考帖子中提到的,这必须单独完成,因为没有可以在连接中使用的列(当然价格和代码除外,但结果非常非常糟糕)。这是show create table
通过 INDEX 非常索引的 、 kod 和 CENA_OD/CENA_DO。
CREATE TABLE `products_loans` (
`KOEF_ID` bigint(20) NOT NULL,
`KOD` varchar(30) NOT NULL,
`AKONTACIA` int(11) NOT NULL,
`POCET_SPLATOK` int(11) NOT NULL,
`koeficient` decimal(10,2) NOT NULL default '0.00',
`CENA_OD` decimal(10,2) default NULL,
`CENA_DO` decimal(10,2) default NULL,
`PREDAJNA_CENA` decimal(10,2) default NULL,
`AKONTACIA_SUMA` decimal(10,2) default NULL,
`TYP_VYHODY` varchar(4) default NULL,
`stage` smallint(6) NOT NULL default '1',
PRIMARY KEY (`KOEF_ID`),
KEY `CENA_OD` (`CENA_OD`),
KEY `CENA_DO` (`CENA_DO`),
KEY `KOD` (`KOD`),
KEY `stage` (`stage`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
并且还选择所有贷款类型,然后通过 php 过滤它们效果不佳,因为每种类型都有超过 50k 条记录,并且选择也需要太多时间......
任何有关提高速度的想法都值得赞赏。
编辑:
这里是解释
+----+-------------+----------------+-------+---------------------+------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+-------+---------------------+------+---------+------+--------+-------------+
| 1 | SIMPLE | products_loans | range | CENA_OD,CENA_DO,KOD | KOD | 92 | NULL | 190158 | Using where |
+----+-------------+----------------+-------+---------------------+------+---------+------+--------+-------------+
我已经尝试了组合索引,它在测试服务器上的性能从 0.44 秒提高到了 0.06 秒,但是我无法从家里访问生产服务器,所以我明天必须尝试一下。