date: 2025-07-03 updated: 2025-07-03 conversation_id: f843492b-21cb-471a-86ad-56df37a5cc89 title: "SQL查询代码优化与索引建议" tags: [deepseek, conversation] ---
SQL查询代码优化与索引建议
创建时间: 2025-07-03 22:15
👤 用户:
帮我优化以下代码 SELECT ztzqfksingle.*, ztlbttsingle.continuenum, ztlbttsingle.high, ztlbttsingle.reasontype, njjrisewatchinghistory.rise, njjrisewatchinghistory.amount, njjrisewatchinghistory.rise20, FROM ztzqfksingle INNER JOIN ztlbttsingle ON ztzqfksingle.CODE = ztlbttsingle.stockcode INNER JOIN njjrisewatchinghistory ON njjrisewatchinghistory.CODE = ztlbttsingle.stockcode ORDER BY ztlbttsingle.continuenum DESC LIMIT 20
💭 思考过程
我们需要注意以下几点来优化这个查询:
- 明确字段:使用表别名,并且只选择必要的字段,而不是使用
ztzqfksingle.*,因为这样可能会选择不需要的字段,影响性能。 - 表连接:确保连接条件正确,并且连接字段上有索引。
- 排序和限制:由于我们只需要前20条,而且排序字段是
ztlbttsingle.continuenum,可以考虑在ztlbttsingle表的continuenum上建立索引,以加快排序。
假设我们无法改变表结构(比如添加索引),我们至少可以优化查询语句本身。
步骤:
- 为每个表指定别名,使查询更简洁。
- 只选择必要的字段,避免使用
*。 - 确保连接条件正确,并且使用合适的连接类型(这里使用INNER JOIN是合适的)。
但是,原查询中有一个问题:在njjrisewatchinghistory的连接条件中,使用了ztlbttsingle.stockcode,而前面已经通过ztzqfksingle.CODE = ztlbttsingle.stock_code连接了。所以这里应该没有问题。
另外,在SELECT子句中,最后一个字段njjrisewatching_history.rise20后面有一个逗号,这是语法错误,需要去掉。
优化后的代码: 我们假设不知道具体需要哪些字段,所以这里只能将ztzqfksingle.替换为具体的字段名,但为了示例,我们暂时保留为(实际中应避免),或者根据需求选择字段。
由于问题要求优化代码,我们假设需要所有字段,但为了性能,我们建议只选择必要的字段。但这里因为不清楚业务,我们只能按照原样,但纠正语法错误,并使用别名。
修改后的查询如下:
以下是优化后的SQL查询代码,并附上优化说明:
SELECT
zzs.*,
zls.continue_num,
zls.high,
zls.reason_type,
nrwh.rise,
nrwh.amount,
nrwh.rise20 -- 移除了末尾多余的逗号
FROM zt_zqfk_single zzs
INNER JOIN zt_lbtt_single zls
ON zzs.CODE = zls.stock_code
INNER JOIN njj_rise_watching_history nrwh
ON zzs.CODE = nrwh.CODE -- 使用第一个表的CODE直接连接
ORDER BY
zls.continue_num DESC
LIMIT 20;
主要优化点:
- 使用表别名:
ztzqfksingle → zzsztlbttsingle → zlsnjjrisewatching_history → nrwh- 提高可读性并减少代码量
- 移除冗余字段:
- 删除了
njjrisewatching_history.rise20字段后的多余逗号(原语法错误)
- 优化连接条件:
- 将第三个表的连接从
zls.stock_code改为直接使用zzs.CODE连接 - 减少一次间接引用,提高可读性(逻辑等价但更直接)
- 字段选择优化:
- 保持
ztzqfksingle.*(假设确实需要所有字段) - 显式列出其他表字段,避免字段冲突
- 格式规范化:
- 统一缩进和大小写
- 每个JOIN语句单独一行
- 排序条件清晰对齐
性能建议(需在数据库执行):
-- 为排序字段添加索引
CREATE INDEX idx_continue_num ON zt_lbtt_single(continue_num DESC);
-- 为连接字段添加索引
CREATE INDEX idx_code ON zt_zqfk_single(CODE);
CREATE INDEX idx_stock_code ON zt_lbtt_single(stock_code);
CREATE INDEX idx_code_history ON njj_rise_watching_history(CODE);
进一步优化建议:
- 避免
SELECT *:
`sql -- 明确指定需要的字段(示例) SELECT zzs.id, zzs.name, ... -- 具体字段 `
- 如果数据量过大:
`sql -- 先限制再排序(根据业务需求) SELECT / 原字段 / FROM ( SELECT * FROM ztlbttsingle ORDER BY continuenum DESC LIMIT 20 ) zls JOIN ztzqfksingle zzs ON zzs.CODE = zls.stockcode JOIN ... -- 其他表 `
优化后的代码在保持原逻辑不变的前提下,提高了可读性、维护性,并修正了语法错误。索引建议能显著提升大数据量下的查询性能。