mysql - 如何将索引添加到表视图 MySQL
问题描述
我遇到了数据库性能问题,因为已构建的查询中有太多连接。我主动创建了一个表格视图,让流程变得比以前更快,代码如下
CREATE VIEW dashboard_sales AS (
SELECT o.order_id,
o.order_date,
o.order_status,
o.order_gender,
o.order_birth_date,
op.op_status,
op.op_payment_code,
oi.oi_qty,
op.op_total,
oi.item_id,
i.item_name,
dc.dc_id,
dc.dc_name,
dc.dc_sales,
c.id_city,
c.name_city,
pc.pc_caption
FROM `order` o
LEFT JOIN order_items oi
ON o.order_id = oi.order_id
LEFT JOIN order_payment op
ON o.order_id = op.order_id
LEFT JOIN item i
ON oi.item_id = i.item_id
LEFT JOIN distribution_channel dc
ON o.dc_id = dc.dc_id
LEFT JOIN city c
ON o.order_city = c.id_city
LEFT JOIN payment_channel pc
ON op.op_payment_code = pc.pc_code
);
但是因为有很多记录,我正在寻找一种通过添加如下索引的解决方案,
CREATE INDEX MyIndex
ON dashboard_sales(op_total, order_date)
但我得到一些像这样的错误,
#1347 - 'matoa_admin.dashboard_sales' is not BASE TABLE
如何解决这个问题?它可以在表格视图中建立索引吗?
解决方案
您需要在表而不是视图本身上创建索引。
op_total 和 order_date 不是这里的第一个问题。您首先需要确保主查询上的 on 子句使用索引列,如果没有,您可能需要为其创建适当的索引。
我建议您使用解释计划来检测性能问题。然后你可以采取必要的行动。
查询本身并没有为我们提供信息,解释计划对于确定可能的问题是必要的
推荐阅读
- node.js - 在客户端包含 nodejs js 模块
- angular - 如何将一个可观察对象映射到另一个对象
- python - 如何在不创建填充按钮的情况下填充 QHBoxLayout 以对齐多个 QGroupBox?
- c# - 为什么我不能在实体框架表中插入行?
- c# - 枪不会在同一个地方产生
- angular - Http获取请求responseType错误:Angular 4
- php - 更新代码在 php 和 mysql 中不起作用
- git - 合并后重用开发分支
- java - 正则表达式 - 匹配仅包含数字并以特定数字开头的字符串
- javascript - 使用 JavaScript 在 HTML 中构建一个简单的测验