我为网络应用程序编写的代码非常小,并且大部分时间仅用于个人使用,因此数据库大小和查询时间从来都不是我的问题。
我使用InnoDB数据库类型是因为我习惯于使用约束(在DELETE CASADE上),因为我排除了许多表中的许多信息并在以后将它们联接。
现在,我创建了一个Web应用程序,每周一次通过CSV文件导入数据。文件大小有时大于1 MB,超过50.000行。
CSV文件来自没有API的旧应用程序。访问数据的唯一方法是将其导出为CSV并将其导入到我的应用中。
我只是通过php将CSV上传到服务器,并使用php将数据逐行添加到我的MySQL数据库中。详细地说,我要遍历文件的每一行并执行“ INSERT INTO”查询。因此,我在创建行和达到数据库内存限制(默认值)时会花很多时间。增大限制的感觉就像是在做错事,并且也导致了较长的查询时间。
我该怎么做才能提高数据库性能?
编辑:它不能直接将CSV加载到MySQL,因为我需要将内容拆分到不同的表中。
例如:CSV的列中包含types
。我创建了一个types
表,并将值添加到该表中,并且在主表中仅添加了ID。因此,以后我在php中具有更大的灵活性,因为我不需要处理值名称。我可以使用id。
另外,我做类似“如果数字以XY开头,则将值Z添加到mysql表中的特定列”之类的事情
答案 0 :(得分:1)
如果文件中有数据,请使用load data infile
。这将比每次插入一行数据快得多。请注意,需要在运行MySQL的服务器上访问该文件。在个人应用程序(大概在单台计算机上运行)上,这应该不是问题。
我也可能建议将数据加载到登台表中。然后从该表插入最终表。这样可以更轻松地处理传入数据中的任何毛刺。
答案 1 :(得分:0)
如果您需要在插入之前在php应用程序中处理数据。您可以将一个多行的INSERT语句组合在一起,这在MySQL中比每行一个INSERT语句快得多。
$data = array(
array(
'title' => 'My title' ,
'name' => 'My Name' ,
'date' => 'My date'
),
array(
'title' => 'Another title' ,
'name' => 'Another Name' ,
'date' => 'Another date'
)
);
$this->db->insert_batch('mytable', $data);
// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')