关于MySQL数据库性能问题
问题描述:
我有表包含大约1400万条记录,并且我有多个SP包含动态SQL,并且这些SP包含多个参数,并且我在我的表上构建索引,但问题是我有一个性能问题,我试图从动态SQL中获取查询并运行它,但是此查询需要30秒到1分钟,我的查询只包含从表中选择的内容,并且一些查询包含与其他表中的数值相关的另一个表的连接,其中语句,分组和顺序通过。关于MySQL数据库性能问题
我检查了状态结果,发现分组需要所有时间,我检查了解释结果,它使用了正确的索引。
所以我应该做些什么来提高我的查询性能。
感谢您的配合。
- 编辑,直接添加查询问题,而不是评论。
SELECT
CONCAT(column1, ' - ', column1 + INTERVAL 1 MONTH) AS DateRange,
cast(SUM(column2) as SIGNED) AS Alias1
FROM
Table1
INNER JOIN Table2 DD
ON Table1.Date = Table2.Date
WHERE
Table1.ID = 1
AND (Date BETWEEN 20110101 AND 20110201)
GROUP BY
MONTH(column1)
ORDER BY
Alias1 ASC
LIMIT 0, 10;
这一个:
SELECT
cast(column1 as char(30)) AS DateRange,
cast(SUM(column2) as SIGNED)
FROM
Table1
INNER JOIN Table2 DD
ON Table1.Date = Table2.Date
WHERE
Table1.ID = 1
AND (Date BETWEEN 20110101 AND 20110102)
GROUP BY
column1
ORDER BY
Alias1 ASC
LIMIT 0, 10;
答
对于此查询:
SELECT
CONCAT(column1, ' - ', column1 + INTERVAL 1 MONTH) AS DateRange <<--error? never mind
, cast(SUM(column2) as SIGNED)
FROM Table1
INNER JOIN Table2 DD ON Table1.Date = Table2.Date
WHERE Table1.ID = 1
AND (Date BETWEEN 20110101 AND 20110201)
GROUP BY MONTH(column1) <<-- problem 1.
ORDER BY column2 ASC <<-- problem 2.
LIMIT 0, 10;
- 如果
group by
功能MySQL不能使用索引。您可以通过在包含年份+月份的表格1中添加一个额外的列YearMonth
,从而加快索引,然后在group by yearmonth
上添加索引。 - 按顺序没有意义。您正在添加
column2
,按该列排序不起任何作用。如果你使用order by yearmonth asc
,查询将运行得更快,更有意义。
+0
是的,你是对的,我命令通过别名为铸(SUM(column2)为SIGNED)而不是第2列,对于这个错误抱歉。 – user977042
+0
任何其他想法,因为我需要解决这个问题。 – user977042
如果您希望我们提供帮助,请向我们显示查询和解释结果。 –
我查询类似下面的查询:SELECT CONCAT(列1, ' - ',列1 +间隔1个月)AS DATERANGE, \t \t \t \t \t \t \t \t \t \t投(SUM(列2)作为签名)\t \t \t \t \t \t \t \t \t FROM表1 \t INNER JOIN表2 DD ON Table1.Date = Table2.Date WHERE Table1.ID = 1 AND(日期之间的20110101和20110201) GROUP BY MONTH(column1) \t \t ORDER BY column2 ASC \t \t LIMIT 0,10; – user977042
和这一个:SELECT铸造(列1为char(30))AS DATERANGE, \t \t \t \t \t \t \t \t \t \t铸造(SUM(列2)的签名)\t \t \t \t \t \t \t \t FROM表1 INNER JOIN Table2 DD ON Table1.Date = Table2.Date WHERE Table1。ID = 1 AND(日期之间的20110101和20110102) GROUP BY列1 \t \t ORDER BY列2 ASC \t \t LIMIT 0,10; – user977042