你是否也遇见过这样的问题:打开一个网页界面,慢的要死,原本以为是自己网的问题,却发现打开其他的网页非常快。如果你遇见过这种问题,很有可能就是和你的SQL有关。
最近在做库房项目就遇到了这样的问题,打开一个界面至少需要15s以上,就这个问题也听过几个用户的埋怨:这个系统做的我不想再用第二次!系统反应慢确实是一个特别恶心的事情,别说用户了,我们在测试的时候也很难受,所以近日我们集中解决了这个问题。库房项目小组一共优化了将近100条SQL语句,优化完之后的SQL语句测试执行速度全部降低到0.1s以内!
我们来谈一谈SQL优化的相关内容吧。
小编也是刚刚接触SQL优化的内容,也就是一个小白。
先说一说小编在库房中用到的SQL优化的内容吧。
- 将视图改为本地表
SELECT
*
FROM
(
SELECT
*
FROM
(
SELECT
T_BorrowLog.itemNo,
T_Item.itemName,
T_Category.categoryName,
T_BorrowLog.number,
T_BorrowLog.purpose,
T_Storage.storageName,
T_BorrowLog.positionID,
t_user.userName AS userName,
t_user.mail AS mail,
T_BorrowLog.lendingDate,
T_BorrowLog.returnDate,
T_BorrowLog. STATUS,
T_BorrowLog.remark,
T_BorrowLog.applicant,
T_BorrowLog.storageID,
T_BorrowLog.op,
T_BorrowLog.lendingTime,
T_Item.isConsumables,
T_BorrowLog.isDel
FROM
T_BorrowLog
INNER JOIN T_Item ON T_BorrowLog.itemNo = T_Item.itemNo
INNER JOIN T_Category ON T_Item.categoryID = T_Category.categoryID
LEFT JOIN t_user ON T_BorrowLog.op = t_user.userID
INNER JOIN T_Storage ON T_BorrowLog.storageID = T_Storage.storageID
) AS V_MyAppliCation
WHERE
applicant = @applicant
AND isDel = 0
ORDER BY
STATUS,
isConsumables
) AS aaa
ORDER BY
CASE
WHEN STATUS = '已借出' THEN
0
ELSE
CASE
WHEN STATUS = '借出审批中' THEN
1
ELSE
CASE
WHEN isConsumables = '非消耗品' THEN
3
ELSE
4
END
END
END
在这个SQL语句中,我把视图v_user全部替换成了本地表t_user,查询速度从30s降低到0.037秒。能够很显然的看出来,数据库在查询视图的过程中浪费了太多的时间,但是将视图换为本地表之虽然速度快了,但是还是有一些其他的问题。我觉得这个SQL语句还可以优化,小编毕竟刚刚接触,相信在以后的学习中会把这个SQL语句再次优化
- 添加索引
索引相当于图书的目录,数据库可以根据目录中的页码快速找到所需的内容。
下面来收一下,MySQL数据库如何建立索引。
第一步:在MySQL数据库中找到要添加索引的表,右击选择设计表选项。
第二步:进入设计表界面之后,选择索引栏
第三步:给索引起一个名字,注意按照命名规则
第四步:索引类型选择Normal
第五步:索引放法选择BTREE
好了,索引建立完毕。这样就可以大大加快你的查询检索速度,但是要正确使用索引,因为所以要占物理空间,当我们进行数据的增、删、改操作的时候,索引也要动态的维护,这会降低我们对数据的维护速度。
关于SQL优化,这只是冰山一角,小编会再接再厉的,加油。