如何提高选择查询的性能

Posted

技术标签:

【中文标题】如何提高选择查询的性能【英文标题】:how to improve performance of select query 【发布时间】:2014-06-03 17:30:17 【问题描述】:

我使用 mysql 在该表中创建了具有 45 列和总共 30000 个数据的表

我必须从这个表中检索所有数据,但这需要很长时间,所以我想做一些优化。我已经应用了主键和唯一键,希望进一步提高性能。

请告知我还能使用什么?下面是创建和选择语句

CREATE TABLE TISMCT 
(
    MASTER_ID         INTEGER AUTO_INCREMENT PRIMARY KEY,             
    SLIP_NO               BIGINT UNIQUE,
    TRUCK_NO          VARCHAR(20),
    SUB_TRANSPORTER_NAME  VARCHAR(50),
    VMS_IN_WB_NO          VARCHAR(10),
    VMS_IN_WB_USER        VARCHAR(50),
    VMS_IN_DATE           DATE,
    VMS_IN_TIME           TIME,
    VMS_TARE_WEIGHT       DECIMAL(11,3),
    VMS_OUT_WB_NO         VARCHAR(10),
    VMS_OUT_WB_USER       VARCHAR(50),
    VMS_OUT_DATE          DATE,
    VMS_OUT_TIME          TIME,
    VMS_GROSS_WEIGHT      DECIMAL(11,3),
    VMS_NET_WEIGHT        DECIMAL(11,3),
    INVOICE_NO            INTEGER,
    ROYALITY_TYPE         VARCHAR(10),
    ROYALTY_PASS_NO       VARCHAR(50),
    EXCISE_AMOUNT         DECIMAL(11,3),
    EDU_CESS_AMOUNT       DECIMAL(11,3),
    HSECESS_AMOUNT        DECIMAL(11,3),
    CLEAN_ENG_CESS_AMOUNT DECIMAL(11,3),
    ROYALTY_AMOUNT       DECIMAL(11,3), 
    BAL_ROYALTY_AMOUNT   DECIMAL(20,3),
    VS_IN_WB_NO           VARCHAR(10),
    VS_IN_WB_USER         VARCHAR(50),
    VS_IN_DATE            DATE,
    VS_IN_TIME            TIME,
    VS_GROSS_WEIGHT       DECIMAL(11,3),
    VS_OUT_WB_NO          VARCHAR(10),
    VS_OUT_WB_USER        VARCHAR(50),
    VS_OUT_DATE       DATE,
    VS_OUT_TIME       TIME,
    VS_TARE_WEIGHT        DECIMAL(11,3),
    VS_NET_WEIGHT         DECIMAL(11,3),
    DUMP_LOCATION         VARCHAR(50),
    IS_BILLED         CHAR(1),
    IS_ACTIVE         CHAR(1),
    CREATED_DT        DATE,
    MODIFY_DT         DATE,
    CREATED_BY            VARCHAR(50),
    MODIFY_BY             VARCHAR(50),
    EXTRA_FIELD1          VARCHAR(50),
    EXTRA_FIELD2          VARCHAR(50),
    EXTRA_FIELD3          VARCHAR(50)
);

查询

SELECT 
  MASTER_ID,
  SLIP_NO,
  TRUCK_NO,
  SUB_TRANSPORTER_NAME,
  VMS_IN_WB_NO,
  VMS_IN_WB_USER,
  VMS_IN_DATE,
  VMS_IN_TIME,
  VMS_TARE_WEIGHT,
  VMS_OUT_WB_NO,
  VMS_OUT_WB_USER,
  VMS_OUT_DATE,
  VMS_OUT_TIME,
  VMS_GROSS_WEIGHT,
  VMS_NET_WEIGHT,
  INVOICE_NO,
  ROYALITY_TYPE,
  ROYALTY_PASS_NO,
  EDU_CESS_AMOUNT,
  HSECESS_AMOUNT,
  CLEAN_ENG_CESS_AMOUNT,
  ROYALTY_AMOUNT,
  BAL_ROYALTY_AMOUNT,
  VS_IN_WB_NO,
  VS_IN_WB_USER,
  VS_IN_DATE,
  VS_IN_TIME,
  VS_GROSS_WEIGHT,
  VS_OUT_WB_NO,
  VS_OUT_WB_USER,
  VS_OUT_DATE,
  VS_OUT_TIME,
  VS_TARE_WEIGHT,
  VS_NET_WEIGHT,
  DUMP_LOCATION,
  IS_BILLED,
  IS_ACTIVE,
  CREATED_DT,
  MODIFY_DT,
  CREATED_BY,
  MODIFY_BY,
  EXTRA_FIELD1,
  EXTRA_FIELD2,
  EXTRA_FIELD3 
FROM
  TISMCT 
WHERE IS_BILLED = 'Y' 
  AND IS_ACTIVE = 'Y' 
ORDER BY CREATED_DT DESC ;

【问题讨论】:

索引已计费,处于活动状态并已创建 dt 【参考方案1】:

在选择本身中,您可以指定一些条件。您真的要检索所有数据还是最新的或最旧的数据。根据您的要求,您可以修改您的查询。

如果你想要基于日期列的最新数据,例如:

Select top 1000 
    column1, colunm2,...... 
From 
    table 
Order By 
    date Desc

这将检索最新的 1000 条记录。

如果您想要基于日期列的最旧数据

Select top 1000 column1, colunm2,...... 
from table 
order by date asc

这将返回最旧的 1000 条记录。

(或) 放置条件

Select top 1000 column1, colunm2,...... 
from table 
where column = 1234 
order by date asc

具体满足您的需求并相应地优化查询。

【讨论】:

我试过一个仍然有一个问题,我们必须考虑哪个值是输出持续时间或获取时间时间操作消息持续时间/获取 3 1 17:30:37 select * from TISMCT_test LIMIT 11000 11000 行返回 0.000 秒 / 0.328 秒【参考方案2】:

好吧,如果您真的需要表和每个记录集中的所有内容,那么您无能为力。不是mysql必须先搜索,只是你想要所有的数据,服务器会花时间把它发送给你。

您需要所有数据的原因是什么?也许你会想太多。

【讨论】:

用户正在将数据从excel上传到数据库,所以我们保留了一张表来上传excel数据,我们还需要在前端显示所有数据以获取最新的5000条记录

以上是关于如何提高选择查询的性能的主要内容,如果未能解决你的问题,请参考以下文章

如何提高 SQL Server 查询的性能以选择具有值的行不在子查询中的一次计数

如何提高sql中的查询性能?

如何提高跨三个连接表的 DISTINCT 选择的性能?

什么索引应该提高选择查询的性能?

结合关系查询提高 Postgres jsonb 查询的性能

要提高SQL查询效率where语句条件的先后次序应如何写