|
二
02
|
做进销存,导入用户期初的数据,期初数据如下:
产品名称、供货商、仓库、数量
导入数据库后需要做的操作有
1.在产品供货商关系表查询该产品和供货商的关系(select),如果没有则插入一条(insert)
2.统计该供货商供该产品一共多少,记入产品供货商关系表中(update)
3.在产品仓库关系表查询该产品和仓库的关系(select),如果没有则插入一条(insert)
4.统计该仓库储存该产品一共多少,记入产品仓库关系表中(update)
5.更新产品仓库关系表统计库存量(update)
6.统计某产品一共多少,记入产品表中(update)
7.更新产品表统计库存量(update)
最开始的对这些数据操作,是为处理页面新增一条期初数据准备的,我写了一个PHP函数,需要执行7~9条SQL语句,速度还可以。但是一次导入2000多条期初数据时候,循环执行这些SQL,速度非常的慢,在数据库服务器基本没有负载的时候,大约需要20分钟。
第一次优化,将所有数据导入数据库后,用一条语句完成每一步的操作,如1和3操作,选出存在的关系作为子表,当期初关系不存在于这个子表的时候进行插入。update操作则用sum和group by,一次更新所有的产品数据。这样操作,在相同服务器条件下,只需要5分钟。
第二次优化,连上数据库观察,几个关系表除了iNo(递增字段,索引)外,没有建立其他索引,每次查询关系是否存在时都需要遍历整个数据表。这说明数据表建立的不合理,将产品字段、仓库字段、供货商字段都设为INDEX索引,在同样的服务器条件下,只需要12秒。
优化经验总结:
SQL语句不应放在循环中进行,要尽可能的一条做完对一个表所有类似操作。数据库和PHP都不慢,但是PHP和数据库之间的连接开销太大。
对数据表,对常需要查询的字段,建立合适的索引,可以大大提高查询速度。但是建立过多的索引,会使insert和update操作变慢,因为这两个操作还需要更新索引。
近期评论