How to transfer a multidimensional array to a MySQL table (through Zeoslib)?
I am using the Zeoslib library in Delphi.
I have a large multidimensional static array that I need to transfer to an empt开发者_StackOverflowy table in a local MySQL database. How can I do this efficiently?
Just iterate through a million insert statements?
- You can use MySQL syntax:
INSERT INTO tab VALUES (v11,..., v1n), ..., (vm1, ..., vmn)
. IOW, you can collect your array rows into chunks consisting of M rows. This will seriously improve performance. (More) - You can offload array into text file, then use
LOAD DATA INFILE
statement to load text file efficiently. (More) - You can consider to use other 3d party libraries, like AnyDAC. Which implements Array DML feature, which is intended exactly for your task. (More)
Multi-dimensional array's don't translate well to MySQL.
If you're dealing with a tiny array you'll probably get things done, but it just doesn't scale. No matter what, it's going to get ugly real soon.
- For a simple 2-dimensional array, you could consider creating a column for one dimension, and use rows for the other. However, you cannot have more than 4096 columns in a table:
http://dev.mysql.com/doc/refman/4.1/en/column-count-limit.html
There is a hard limit of 4096 columns per table, but the effective maximum may be less for a given table. The exact limit depends on several interacting factors, listed in the following discussion.
Every table has a maximum row size of 65,535 bytes. This maximum applies to all storage engines, but a given engine might have additional constraints that result in a lower effective maximum row size.
- Or, you can create a row per array item, and store the index of each dimension as a primary key.But when you want to retrieve the values, you need to create a monster query.
- You either need to do:
- multiple joins, but you can only do 61 joins in a query:
http://dev.mysql.com/doc/refman/5.0/en/joins-limits.html
The maximum number of tables that can be referenced in a single join is 61. This also applies to the number of tables that can be referenced in the definition of a view.
-
- Or create a query, group by the row key, and conditionally pick the right value with the combination of a group function and a condition, something like this:
sum(if(x=1,y,0))
- Or create a query, group by the row key, and conditionally pick the right value with the combination of a group function and a condition, something like this:
I had the same problem, only in php 2D arrays. Save the dimensions of the array (x, y, z etc. length, meaning the number of values on each level). then join the whole array into ane long string, divide with a special, unique character like |
or ,
, and when you fetch the data you can split the sting based on the dimensions data.
If you need it, I can show you my php code, but I see you prefer delphi.
EDIT: this is an answer for your question before you edited it. Now it's kind of irrelevant.
精彩评论