README.md in multisert-0.0.0.alpha vs README.md in multisert-0.0.1

- old
+ new

@@ -16,10 +16,73 @@ $ gem install multisert ## Usage -TODO: Write usage instructions here +Let's start with a table: + +```sql +CREATE TABLE IF NOT EXISTS some_database.some_table ( + field_1 int default null, + field_2 int default null, + field_3 int default null, + field_4 int default null +); +``` + +Now let's say we want to insert 1,000,000 records after running the +current iterator through `some_magical_calculation` into our table from above. +Let's assume that `some_magical_calculation` takes a single integer input and +returns an array of 4 values. + +```ruby +(0..1_000_000).each do |i| + res = some_magical_calculation(i) + dbclient.query %[ + INSERT INTO some_database.some_table (field_1, field_2, field_3, field_4) + VALUES (#{res[0]}, #{res[1]}, #{res[2]}, #{res[3]})] +end +``` + +This works, but we can improve it's speed by bundling up inserts using +`Multisert`: + +```ruby +buffer = Multisert.new connection: dbclient, + database: 'some_database', + table: 'some_table', + fields: ['field_1', 'field_2', 'field_3', 'field_4'] + +(0..1_000_000).each do |i| + res = some_magical_calculation(i) + buffer << res +end +buffer.flush! +``` + +We start by creating a new Multisert instance, providing the database +connection, database and table, and fields as attributes. Next, as we get the +results from `some_magical_calculation`, we shovel each into the Multisert +instance. As we iterate through, the Multisert instance will build up the +records and then flush itself to the specified database table when it hits an +internal count (default is 10_000, but can be set via the `max_buffer_count` +attribute). One last thing to note is the `buffer.flush!` at the end of the +script. This ensures that any pending entries are written to the database table +that were not automatically taken care of by the auto-flush that will kick in +during the iteration. + +## FAQ + +### Packet Too Large / Connection Lost Errors + +You may run into the "Packet Too Large" error when attempting to run a +multisert. This can comeback as this error explicitly or as a "Connection +Lost" error, depending on your mysql client. + +To learn more, [read the documentation](http://dev.mysql.com/doc/refman/5.5/en//packet-too-large.html). + +If you need to you can adjust the buffer size by setting `max_buffer_count` +attribute. Generally, 10,000 to 100,000 is a pretty good starting range. ## Contributing 1. Fork it 2. Create your feature branch (`git checkout -b my-new-feature`)