python - 使用 python 和 VueJS 优化 5MB 查询结果的显示

标签 python mysql vue.js

我有一个 Web 应用程序,在服务器(bottle)上使用 python,在客户端使用 VueJS。 一个前端组件显示查询的分页结果,该查询以超过 10k 条记录结尾。记录保存为 python dict 并发送到前端。结果的大小约为 5.5MB,我的互联网连接结束时等待了 2 秒以上。

处理请求的 api 路径如下所示:

@cmCampaigns.get('/api/campaignManager/campaigns')
@authorize()
def get():
    resp = {}
    usr = authlayer.current_user
    user_id = dao.App().getUserID(usr.username)
    resp["campaigns"] = CampaignsData().get_revcontent_campaigns(user_id)

    return resp

查询本身是这样的:

def get_campaigns(self, user_id):
    query = "SELECT rc.account_id, rc.campaign_id, " \
            "rc.campaign_name, rc.start_date, rc.end_date, " \
            "rc.enabled, rc.default_bid, " \
            "rc.budget, rc.cost, ctr,rc.country_codes, " \
            "'revcontent' AS provider, " \
            "replace(JSON_EXTRACT(ac.account_json,'$.client_id'),'\"','') AS account_name, " \
            "CASE enabled " \
            "WHEN enabled = 'active' THEN 'on' " \
            "WHEN enabled = 'inactive' THEN 'off' " \
            "END AS enabled_val " \
            "FROM prv_campaigns AS rc " \
            "INNER JOIN websites AS ws " \
            "ON rc.website_id = ws.website_id " \
            "INNER JOIN website_users AS wu " \
            "ON wu.website_id = ws.website_id " \
            "INNER JOIN prv_accounts ac " \
            "ON rc.account_id = ac.account_id " \
            "WHERE wu.user_id = %s " \
            "ORDER BY id DESC"
    try:
        data = self.db.query(query, user_id)
        return data
    except Exception as e:
        logging.exception(e.message)
        return -1, e.message

我尝试尽可能优化查询,但仍然不够。 有哪些“最佳实践”解决方案可以优化这种通用逻辑?在发送之前压缩字典?我在考虑分页,但后来我的过滤和排序逻辑在客户端,所以很多数据显然消失了……有什么建议吗??谢谢

最佳答案

对于分页,您可以使用 LIMIT 和 OFFSET

优化?在查询之前运行“EXPLAIN”并带来输出

让我们快速浏览一下

SELECT rc.account_id, 
       rc.campaign_id, 
       rc.campaign_name, 
       rc.start_date, 
       rc.end_date, 
       rc.enabled, 
       rc.default_bid, 
       rc.budget, 
       rc.cost, 
       ctr, 
       rc.country_codes, 
       'revcontent'                                                   AS 
       provider, 
       Replace(Json_extract(ac.account_json, '$.client_id'), '"', '') AS 
       account_name, 
       CASE enabled 
         WHEN enabled = 'active' THEN 'on' 
         WHEN enabled = 'inactive' THEN 'off' 
       END                                                            AS 
       enabled_val 
FROM   prv_campaigns AS rc 
       inner join websites AS ws 
               ON rc.website_id = ws.website_id 
       inner join website_users AS wu 
               ON wu.website_id = ws.website_id 
       inner join prv_accounts ac 
               ON rc.account_id = ac.account_id 
WHERE  wu.user_id = %s 
ORDER  BY id DESC 
  • 启用的列应该是数字或枚举,这将节省 strcmp 时间
  • Replace(Json_extract(ac.account_json, '$.client_id'), '"', '') ? 提取所有账户名在客户端做你的事
  • 2 个内连接 ?可能是设计问题

关于python - 使用 python 和 VueJS 优化 5MB 查询结果的显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47888487/

相关文章:

javascript - Vue JS v-html 指令呈现原始 html

php - 无法使用 PHP 和 Mysql 退出循环

php - 将 json 从 jquery 发送到 php 并插入数据库

javascript - 使用 Firebase 更新文档字段时使用 Object.assign

javascript - 如何在 Bootstrap-Vue 中制作全 Angular 标签卡?

mysql - 当只有一场比赛就足够时,如何显示整个小组

python - pytest不跳过未标记的测试

python - 如何在Python中模拟右键单击?

python - 策划 Python 编码

python - 如何使用 pyzmq 发送带有 PUB/SUB 模式的字典?