1.最近项目上通过sku_property表中需要多条件查询skuid反查询,property_code和property_value_code同时满足最多9个条件查询出skuId,表中数据有300多万
sql语句如下:
select s.*,sp.* from sku s inner join sku_property sp on s.id=sp.sku_id where sp.sku_id in (select temp.sku_id (select sku_id from sku_property where (property_code='1111' and property_value_code='222') or (property_code='1111' and property_value_code='333') or (property_code='1111' and property_value_code='444') group by sku_id having count(sku_id)>3 limit 0,10)temp)
mybatis中 condition的数据是 List 3用这个取值(#{condition.size}-1)
多个or条件使用 foreach中的 item="item" index="index" collection="condition" open"(" close=“)” separator=")or("
foreach中的内容是: property_code=#{item.propertyCode} and property_value_code=#{item.propertyValueCode}
期间将2列值合并为1列也用in代替多个or时间和多个or差不多
300多万数据,navicat上执行,实际估计还有结果映射成实体还得多耗点儿时间 查询最多4个条件加分页几十毫秒执行完成,如果到5个以上后就得1.5s到2s 条件达到9后,执行count(sku_id)>3时也挺快的,但是做交集要 count(sku_id)>8
期间培训库上使用insert into sku_property_copy(id,sku_id,property_code,property_value_code) select id,sku_id,property_code,property_value_code from sku_property
insert into sku_property_copy select * from sku_property 期间有tinyint的报错提示int类型插入不进去type字段
解决方案:插入中间表
锁表:
sku_property_copy上加了6个左右索引,期间执行insert into select 查询插入导致sku_property_copy中间表数据达到800多万,删除索引同时有人通过web应用操作数据库造成数据库表锁表,此时用show processlist可以查看mysql多个执行中的进程。将block wait的进程kill掉进程id就release掉表锁。
操作数据库前一定要back replica,同时不要使用别人的table test