在视图中避免使用JSON_ARRAYAGG和GROUP BY进行MySQL全表扫描

时间:2018-10-25 23:16:07

标签: mysql view group-by

我有两个表from PIL import Image,ImageDraw,ImageFont import os #setting varibles imgFile = "frame_0.jpg" output = "frame_edit_0.jpg" font = ImageFont.truetype("arial.ttf", 30) text = "SEQ_00100_SHOT_0004_FR_0001" textColor = 'white' shadowColor = 'black' outlineAmount = 3 #open image img = Image.open(imgFile) draw = ImageDraw.Draw(img) #get the size of the image imgWidth,imgHeight = img.size #get text size txtWidth, txtHeight = draw.textsize(text, font=font) #get location to place text x = imgWidth - txtWidth - 100 y = imgHeight - txtHeight - 100 #create outline text for adj in range(outlineAmount): #move right draw.text((x-adj, y), text, font=font, fill=shadowColor) #move left draw.text((x+adj, y), text, font=font, fill=shadowColor) #move up draw.text((x, y+adj), text, font=font, fill=shadowColor) #move down draw.text((x, y-adj), text, font=font, fill=shadowColor) #diagnal left up draw.text((x-adj, y+adj), text, font=font, fill=shadowColor) #diagnal right up draw.text((x+adj, y+adj), text, font=font, fill=shadowColor) #diagnal left down draw.text((x-adj, y-adj), text, font=font, fill=shadowColor) #diagnal right down draw.text((x+adj, y-adj), text, font=font, fill=shadowColor) #create normal text on image draw.text((x,y), text, font=font, fill=textColor) img.save(output) print 'Finished' os.startfile(output) practice,它们之间有一对多的关系,该关系是通过链接表facility建立的。

我想要一个在json数组中聚合关系的“很多”部分的结果。以下查询会产生所需的结果:

查询

facility_practice

结果

select 
    practice.id
    , practice.name
    , practice.code

    , json_arrayagg(json_object(
        "id", facility.id
        , "name", facility.name
        , "code", facility.code
    )) as facility_json
from practice
left join facility_practice
    on facility_practice.practice_id = practice.id
left join facility
    on facility.id = facility_practice.facility_id
where practice.id = 1
group by practice.id;

如果我+----+------+-------+---------------------------------------------------------------------------------------------+ | id | name | code | facility_json | +----+------+-------+---------------------------------------------------------------------------------------------+ | 1 | Test | NA | [{"id": 1, "code": "NA", "name": "Test"}, {"id": 15, "code": "HV", "name": "Harbour View"}] | +----+------+-------+---------------------------------------------------------------------------------------------+ 进行上述查询,我​​将获得期望的结果:

说明

explain

如果我随后尝试根据该查询创建视图,则MySQL突然对练习表执行全表扫描。我注意到,如果删除查询的+----+-------------+-------------------+--------+-------------+ | id | select_type | table | type | key | +----+-------------+-------------------+--------+-------------+ | 1 | SIMPLE | practice | const | PRIMARY | +----+-------------+-------------------+--------+-------------+ | 1 | SIMPLE | facility_practice | ref | practice_id | +----+-------------+-------------------+--------+-------------+ | 1 | SIMPLE | facility | eq_ref | PRIMARY | +----+-------------+-------------------+--------+-------------+ 部分,它将不再进行全表扫描;但是,结果不再正确(显然)。

查看

group by

说明

drop view if exists practice_facility_v;    

create view practice_facility_v as
select 
    practice.id
    , practice.name
    , practice.code

    , json_arrayagg(json_object(
        "id", facility.id
        , "name", facility.name
        , "code", facility.code
    )) as facility_json
from practice
left join facility_practice
    on facility_practice.practice_id = practice.id
left join facility
    on facility.id = facility_practice.facility_id
group by practice.id;

select * from practice_facility_v where id = 1;

0 个答案:

没有答案