SQL教程栏目介绍如何更有效理解MySQL
推荐(免费):SQL教程
属性表(product_props)结构如下
数据量800W以上
字段名 | 类型 | 说明 |
---|---|---|
id | int | id |
pn_id | int | 属性类型 |
pv_id | int | 属性值 |
product_id | int | 产品ID |
其中product_id与pn_id,pv_id是一对多的关系。
数据类似这样:
product_id | pn_id | pv_id |
---|---|---|
10970 | 5 (型号) | 135 (苹果9) |
10970 | 11 (内存) | 23 (512G) |
10970 | 10 (颜色) | 17 (土豪金) |
10970 | 8 (网络) | 6(5G) |
10980 | 5 | 135 |
10980 | 11 | 24 (1024G) |
10980 | 10 | 16 (极光蓝) |
产品表(product)结构如下
数据量40W以上
字段名 | 类型 | 说明 |
---|---|---|
product_id | int | product_id |
type_id | int | 类型id |
brand_id | int | 品牌id |
model_id | int | 型号id |
status | tinyint | 状态 |
数据类似以下:
product_id | type_id | brand_id | model_id | status |
---|---|---|---|---|
10970 | 1(手机) | 1(苹果) | 1(Iphone8) | 1(正常) |
10980 | 1(手机) | 1(苹果) | 1(Iphone8X) | 3(已售) |
10981 | 1(手机) | 1(苹果) | 1(Iphone8XP) | 1(正常) |
问题
找出型号为苹果9同时内存为512G,颜色为土豪金,状态为正常的产品总数,
ps : 属性条件可能会有超过10组。
要求
性能第一,杜绝聚合函数等
原问题的解决方案性能排行
- 来自 @Kamicloud的 exist方案
SELECT sql_no_cache `product_id` FROM `zx_tests` AS a WHERE `pn_id` = 101 AND `pv_id` = 59 AND EXISTS( SELECT sql_no_cache * FROM `zx_tests` WHERE a.product_id = product_id and `pn_id` = 101 AND `pv_id` = 171); 2 组条件下 0.657,3 组 0.695,4 组 0.759,5 组 0.743 (单独查属性表)
- 来自 @Elijah_Wang的子查询方案
SELECT `product_id` FROM `product` WHERE `pn_id` = 5 AND `pv_id` = 135 AND `product_id` IN (SELECT `product_id` FROM `product` WHERE `pn_id` = 11 AND `pv_id` = 23); 2 组条件下 0.729,3 组 0.75,4 组 0.730,5 组 0.757 (新问题之前)
新问题之后的性能排行
- 来自 @Elijah_Wang的子查询方案
select SQL_NO_CACHE count(1) from pdi_product a join ( SELECT distinct product_id FROM `product_props` WHERE `pn_id` = 5 AND `pv_id` = 127 AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 11 AND `pv_id` = 22 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 10 AND `pv_id` = 18 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 8 AND `pv_id` = 6 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 9 AND `pv_id` = 1 ) ) b on a.product_id = b.product_id where a.status = 1;
耗时1.5-1.56 (执行10次的范围)
- expain分析:
select SQL_NO_CACHE count(1) from pdi_product a where a.status = 1 and a.product_id in (SELECT distinct product_id FROM `product_props` WHERE `pn_id` = 5 AND `pv_id` = 127 AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 11 AND `pv_id` = 22 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 10 AND `pv_id` = 18 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 8 AND `pv_id` = 6 ) AND `product_id` IN ( SELECT `product_id` FROM `product_props` WHERE `pn_id` = 9 AND `pv_id` = 1 ))
耗时0.69-0.72(执行10次的范围)
- explain分析:
- 来自 @Kamicloud的 exist方案
SELECT SQL_NO_CACHE count(1) FROM product a WHERE a.STATUS = 1 AND a.product_id IN ( SELECT DISTINCT `product_id` FROM `product_props` AS a WHERE a.`pn_id` = 5 AND a.`pv_id` = 127 AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 11 AND `pv_id` = 22 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 10 AND `pv_id` = 18 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 9 AND `pv_id` = 1 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 8 AND `pv_id` = 6 ) );
耗时5.7-5.85 (执行10次的范围)
- explain分析:
SELECT SQL_NO_CACHE count(1) FROM pdi_product a join (SELECT DISTINCT `product_id` FROM `product_props` AS a WHERE a.`pn_id` = 5 AND a.`pv_id` = 127 AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 11 AND `pv_id` = 22 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 10 AND `pv_id` = 18 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 9 AND `pv_id` = 1 ) AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 8 AND `pv_id` = 6 ) ) b on a.product_id = b.product_id WHERE a.STATUS = 1
耗时5.7-6.0(执行10次的范围)
- explain分析:
可以看到如果单纯查属性表,第一位的速度是最快的,可要查产品状态后,速度反而不如子查询。
经explain分析,第一个子查询速度之所以快是因为它的sql简单,select_type皆为simple。
而不管是join还是exists的方式,select_type大多为DERIVED,DEPENDENT SUBQUERY。
相关免费学习推荐:mysql视频教程
以上是解决 SQL 问题绝对能让你对 MySQL 的理解更进一步!的详细内容。更多信息请关注PHP中文网其他相关文章!

SQL的高级查询技巧包括子查询、窗口函数、CTE和复杂JOIN,能够处理复杂数据分析需求。1)子查询用于找出每个部门工资最高的员工。2)窗口函数和CTE用于分析员工的薪资增长趋势。3)性能优化策略包括索引优化、查询重写和使用分区表。

MySQL是开源的关系型数据库管理系统,提供了标准SQL功能和扩展。1)MySQL支持标准SQL操作如CREATE、INSERT、UPDATE、DELETE,并扩展了LIMIT子句。2)它使用InnoDB和MyISAM等存储引擎,适用于不同场景。3)用户可以通过创建表、插入数据和使用存储过程等高级功能高效使用MySQL。

sqlmakesdatamanagectAccessibletoAllbyProvidingAsimpleyetpoperfultoolSetSetForQuerquereingAndManagingDatabases.1)ItworkswithrelationalDatabases,允许inserstospecefifywhattheywanttododowithththedata.2)

SQL索引可以通过巧妙的设计显着提升查询性能。 1.选择合适的索引类型,如B-tree、哈希或全文索引。 2.使用复合索引优化多字段查询。 3.避免过度索引以减少数据维护开销。 4.定期维护索引,包括重建和移除不必要的索引。

在 SQL 中删除约束,请执行以下步骤:识别要删除的约束名称;使用 ALTER TABLE 语句:ALTER TABLE 表名 DROP CONSTRAINT 约束名;确认删除。

SQL 触发器是一种在指定表上执行特定事件时自动执行特定操作的数据库对象。要设置 SQL 触发器,可以使用 CREATE TRIGGER 语句,其中包括触发器名称、表名称、事件类型和触发器代码。触发器代码使用 AS 关键字进行定义,并包含 SQL 或 PL/SQL 语句或块。通过指定触发器条件,可以使用 WHERE 子句限制触发器的执行范围。可以使用 INSERT INTO、UPDATE 或 DELETE 语句在触发器代码中执行触发器操作。NEW 和 OLD 关键字可以在触发器代码中用来引用受影

索引是一种通过排序数据列来加速数据查找的数据结构。为 SQL 查询添加索引的步骤如下:确定需要索引的列。选择合适的索引类型(B 树、哈希或位图)。使用 CREATE INDEX 命令创建索引。定期重建或重新组织索引以维护其效率。添加索引的好处包括提高查询性能、减少 I/O 操作、优化排序和筛选以及提高并发性。当查询经常使用特定列、返回大量数据需要排序或分组、涉及多个表或数据库表较大时,应该考虑添加索引。

IFELSE 语句是一种条件语句,用于根据条件评估结果返回不同值。其语法结构为:IF (condition) THEN return_value_if_condition_is_true ELSE return_value_if_condition_is_false END IF;。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能