SlideShare ist ein Scribd-Unternehmen logo
1 von 70
Downloaden Sie, um offline zu lesen
How to import 1 million SKUs
in under 10 minutes
1/26
Building an import correctly is hard
2/26
2008
it all started with
DataFlow
3/26
DataFlow
4/26
DataFlow
Stores CSV
records into
database
4/26
DataFlow
Stores CSV
records into
database
Imports product
by product via
AJAX call
4/26
DataFlow
Stores CSV
records into
database
Imports product
by product via
AJAX call
Uses product
model to save
data
4/26
DataFlow
Stores CSV
records into
database
Imports product
by product via
AJAX call
Uses product
model to save
data
Closing the
browser window
stops the whole
process
4/26
Speed
2-3 products per second
5/26
Speed
2-3 products per second
~ 20 minutes for 5k products
5/26
2011
Import/Export saved us all
6/26
ImportExport
7/26
ImportExport
Stored batches of
data into the
database during
validation
7/26
ImportExport
Stored batches of
data into the
database during
validation
Processes stored
data in one HTTP
request
7/26
ImportExport
Stored batches of
data into the
database during
validation
Processes stored
data in one HTTP
request
Validates product
data without using
product model
7/26
ImportExport
Stored batches of
data into the
database during
validation
Processes stored
data in one HTTP
request
Validates product
data without using
product model
Uses multi-row
inserts to
populate tables
7/26
ImportExport
Stored batches of
data into the
database during
validation
Processes stored
data in one HTTP
request
Validates product
data without using
product model
Uses multi-row
inserts to
populate tables
Does not run
indexers
7/26
Speed
41 product per second
8/26
Speed
41 product per second
~ 2 minutes for 5k products
8/26
But there are some
drawbacks
9/26
High memory usage on large datasets
But there are some
drawbacks
9/26
High memory usage on large datasets
Slow in generating primary keys for new products
But there are some
drawbacks
9/26
2015
Magento 2.x
Import Export
10/26
ImportExport M2
11/26
Same base functionality as in M1
ImportExport M2
11/26
Same base functionality as in M1
More complex file format to edit and parse
ImportExport M2
11/26
Same base functionality as in M1
More complex file format to edit and parse
Slower on complex product data
ImportExport M2
11/26
Same base functionality as in M1
More complex file format to edit and parse
Slower on complex product data
Adds additional single statement inserts
ImportExport M2
11/26
2019
I got an idea and a project to implement it on
12/26
Separate Feeds
13/26
Separate Feeds
Main entity (sku, type, set)
13/26
Separate Feeds
Main entity (sku, type, set)
Attributes (sku, attribute, store, value)
13/26
Separate Feeds
Main entity (sku, type, set)
Attributes (sku, attribute, store, value)
Category (sku, category slug, position)
13/26
Separate Feeds
Main entity (sku, type, set)
Attributes (sku, attribute, store, value)
Category (sku, category slug, position)
Configurable Options (sku, attribute, label)
13/26
Separate Feeds
Main entity (sku, type, set)
Attributes (sku, attribute, store, value)
Category (sku, category slug, position)
Configurable Options (sku, attribute, label)
Images (sku, image)
13/26
Separate Feeds
Main entity (sku, type, set)
Attributes (sku, attribute, store, value)
Category (sku, category slug, position)
Configurable Options (sku, attribute, label)
Images (sku, image)
...
13/26
Lazy Entity Resolving
14/26
Lazy Entity Resolving
Reduce memory requirements of the import
14/26
Lazy Entity Resolving
Reduce memory requirements of the import
Cleaner and more readable feed processing
14/26
Lazy Entity Resolving
Reduce memory requirements of the import
Cleaner and more readable feed processing
Possibility of acquiring entity ids in batches
automatically
14/26
Lazy Entity Resolving
$resolver = $this->resolverFactory->createSingleValueResolver(
'catalog_product_entity', 'sku', 'entity_id'
);
 
$insert = InsertOnDuplicate::create(
'catalog_product_entity_varchar',
['entity_id', 'attribute_id', 'store_id', 'value']
)->withResolver($resolver);
 
$insert
->withRow($resolver->unresolved('sku1'), 1, 0, 'some value')
->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1')
->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2');
15/26
Configure table lookup information
Lazy Entity Resolving
$resolver = $this->resolverFactory->createSingleValueResolver(
'catalog_product_entity', 'sku', 'entity_id'
);
 
$insert = InsertOnDuplicate::create(
'catalog_product_entity_varchar',
['entity_id', 'attribute_id', 'store_id', 'value']
)->withResolver($resolver);
 
$insert
->withRow($resolver->unresolved('sku1'), 1, 0, 'some value')
->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1')
->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2');
15/26
Pass resolver into insert builder
Lazy Entity Resolving
$insert = InsertOnDuplicate::create(
'catalog_product_entity_varchar',
['entity_id', 'attribute_id', 'store_id', 'value']
)->withResolver($resolver);
$resolver = $this->resolverFactory->createSingleValueResolver(
'catalog_product_entity', 'sku', 'entity_id'
);
 
 
$insert
->withRow($resolver->unresolved('sku1'), 1, 0, 'some value')
->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1')
->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2');
15/26
Use resolver to create identifier containers
Lazy Entity Resolving
->withRow($resolver->unresolved('sku1'), 1, 0, 'some value')
->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1')
->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2');
$resolver = $this->resolverFactory->createSingleValueResolver(
'catalog_product_entity', 'sku', 'entity_id'
);
 
$insert = InsertOnDuplicate::create(
'catalog_product_entity_varchar',
['entity_id', 'attribute_id', 'store_id', 'value']
)->withResolver($resolver);
 
$insert
15/26
Insert on duplicate will skip any unresolved entries
Lazy Entity Resolving
$resolver = $this->resolverFactory->createSingleValueResolver(
'catalog_product_entity', 'sku', 'entity_id'
);
 
$insert = InsertOnDuplicate::create(
'catalog_product_entity_varchar',
['entity_id', 'attribute_id', 'store_id', 'value']
)->withResolver($resolver);
 
$insert
->withRow($resolver->unresolved('sku1'), 1, 0, 'some value')
->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1')
->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2');
15/26
16/26
Batch auto-increment generation
START TRANSACTION;
 
INSERT INTO catalog_product_entity (sku)
VALUES
('sku1'),
('sku2'),
('sku3'),
('sku4');
 
SELECT entity_id, sku
FROM catalog_product_entity
WHERE
sku IN ('sku1', 'sku2', 'sku3', 'sku4');
 
ROLLBACK;
17/26
Start a transaction
Batch auto-increment generation
START TRANSACTION;
 
INSERT INTO catalog_product_entity (sku)
VALUES
('sku1'),
('sku2'),
('sku3'),
('sku4');
 
SELECT entity_id, sku
FROM catalog_product_entity
WHERE
sku IN ('sku1', 'sku2', 'sku3', 'sku4');
 
ROLLBACK;
17/26
Populate table with un-resolved keys
Batch auto-increment generation
 
INSERT INTO catalog_product_entity (sku)
VALUES
('sku1'),
('sku2'),
('sku3'),
('sku4');
 
START TRANSACTION;
SELECT entity_id, sku
FROM catalog_product_entity
WHERE
sku IN ('sku1', 'sku2', 'sku3', 'sku4');
 
ROLLBACK;
17/26
Retrieve new identifiers
Batch auto-increment generation
SELECT entity_id, sku
FROM catalog_product_entity
WHERE
sku IN ('sku1', 'sku2', 'sku3', 'sku4');
 
START TRANSACTION;
 
INSERT INTO catalog_product_entity (sku)
VALUES
('sku1'),
('sku2'),
('sku3'),
('sku4');
 
ROLLBACK;
17/26
Rollback transaction
Batch auto-increment generation
ROLLBACK;
START TRANSACTION;
 
INSERT INTO catalog_product_entity (sku)
VALUES
('sku1'),
('sku2'),
('sku3'),
('sku4');
 
SELECT entity_id, sku
FROM catalog_product_entity
WHERE
sku IN ('sku1', 'sku2', 'sku3', 'sku4');
 
17/26
Prepared Statements
18/26
Compile query for constant batch size
Prepared Statements
18/26
Compile query for constant batch size
Send only data instead of generating new queries
Prepared Statements
18/26
Compile query for constant batch size
Send only data instead of generating new queries
Reduces query processing on MySQL side by half
Prepared Statements
18/26
Speed
450 products per second
19/26
Speed
450 products per second
~ 11 seconds for 5k products
19/26
But it was still not good enough
20/26
But it was still not good enough
45 minutes to import 1 million SKUs
20/26
Sure, because it's a sequential process...
21/26
So I made it asynchronous as PoC
22/26
Under the hood
23/26
Under the hood
Each target tabletarget table receives a separate connection
to MySQL
23/26
Under the hood
Each target tabletarget table receives a separate connection
to MySQL
Identity resolver is attached to the source table
connection
23/26
Under the hood
Each target tabletarget table receives a separate connection
to MySQL
Identity resolver is attached to the source table
connection
Each feed is processed concurrently by using
round robinround robin strategy
23/26
Under the hood
Each target tabletarget table receives a separate connection
to MySQL
Identity resolver is attached to the source table
connection
Each feed is processed concurrently by using
round robinround robin strategy
During MySQL query execution PHP prepares the
next batch
23/26
Speed
1,850 products per second
24/26
Speed
1,850 products per second
~ 9 minutes for 1m products
24/26
It is coming this fall as an open source tool for
everyone!
25/26
Questions
ivan@ecomdev.org
IvanChepurnyi.GitHub.io
26/26

Weitere ähnliche Inhalte

Was ist angesagt?

Fb08 individual document reversal
Fb08 individual document reversalFb08 individual document reversal
Fb08 individual document reversalFarooq Wangde
 
Dynamic Function Call in PI Sheet (XStep)
Dynamic Function Call in PI Sheet (XStep)Dynamic Function Call in PI Sheet (XStep)
Dynamic Function Call in PI Sheet (XStep)Ankit Sharma
 
Sap script made easy
Sap script made easySap script made easy
Sap script made easyKranthi Kumar
 
Chapter 02 sap script forms
Chapter 02 sap script formsChapter 02 sap script forms
Chapter 02 sap script formsKranthi Kumar
 
Assigning the personal numbers in the maintenance work centers
Assigning the personal numbers in the maintenance work centersAssigning the personal numbers in the maintenance work centers
Assigning the personal numbers in the maintenance work centersVenkatesh Babu
 
SAP-ECM and PPPI Integration-Solution
SAP-ECM and PPPI Integration-SolutionSAP-ECM and PPPI Integration-Solution
SAP-ECM and PPPI Integration-SolutionVijay Pisipaty
 
F 04 gl account clearing
F 04 gl account clearingF 04 gl account clearing
F 04 gl account clearingFarooq Wangde
 
Microsoft Office Excel 2003 Sorting And Filtering
Microsoft Office Excel 2003 Sorting And FilteringMicrosoft Office Excel 2003 Sorting And Filtering
Microsoft Office Excel 2003 Sorting And FilteringMarc Morgenstern
 
Implementing Auditing in SQL Server
Implementing Auditing in SQL ServerImplementing Auditing in SQL Server
Implementing Auditing in SQL ServerDavid Dye
 
Parameters in Tableau
Parameters in TableauParameters in Tableau
Parameters in TableauKanika Nagpal
 
IBM Pure Data System for Analytics (Netezza)
IBM Pure Data System for Analytics (Netezza)IBM Pure Data System for Analytics (Netezza)
IBM Pure Data System for Analytics (Netezza)Girish Srivastava
 
Bankreconciliationconfiguration[1]
Bankreconciliationconfiguration[1]Bankreconciliationconfiguration[1]
Bankreconciliationconfiguration[1]Nishant Malhotra
 
AX 2012 R3 Installation Guide
AX 2012 R3 Installation GuideAX 2012 R3 Installation Guide
AX 2012 R3 Installation GuideBiswanath Dey
 
MySQL Hash Table
MySQL Hash TableMySQL Hash Table
MySQL Hash TableMIJIN AN
 
Call transaction method
Call transaction methodCall transaction method
Call transaction methodKranthi Kumar
 
Fi to mm integration by Naga srinivas irrinki 9550292839
Fi to mm integration by Naga srinivas irrinki 9550292839Fi to mm integration by Naga srinivas irrinki 9550292839
Fi to mm integration by Naga srinivas irrinki 9550292839NAGA SRINIVAS IRRINKI
 
Table sap sd
Table sap sdTable sap sd
Table sap sdMuldani .
 
411226987-SAP-MM-Implementation-Project (1).pdf
411226987-SAP-MM-Implementation-Project (1).pdf411226987-SAP-MM-Implementation-Project (1).pdf
411226987-SAP-MM-Implementation-Project (1).pdfSekarbaluChandru
 
Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...
Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...
Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...stannventures.Pvt.Ltd
 

Was ist angesagt? (20)

Fb08 individual document reversal
Fb08 individual document reversalFb08 individual document reversal
Fb08 individual document reversal
 
Dynamic Function Call in PI Sheet (XStep)
Dynamic Function Call in PI Sheet (XStep)Dynamic Function Call in PI Sheet (XStep)
Dynamic Function Call in PI Sheet (XStep)
 
Sap script made easy
Sap script made easySap script made easy
Sap script made easy
 
Chapter 02 sap script forms
Chapter 02 sap script formsChapter 02 sap script forms
Chapter 02 sap script forms
 
Assigning the personal numbers in the maintenance work centers
Assigning the personal numbers in the maintenance work centersAssigning the personal numbers in the maintenance work centers
Assigning the personal numbers in the maintenance work centers
 
SAP-ECM and PPPI Integration-Solution
SAP-ECM and PPPI Integration-SolutionSAP-ECM and PPPI Integration-Solution
SAP-ECM and PPPI Integration-Solution
 
F 04 gl account clearing
F 04 gl account clearingF 04 gl account clearing
F 04 gl account clearing
 
Microsoft Office Excel 2003 Sorting And Filtering
Microsoft Office Excel 2003 Sorting And FilteringMicrosoft Office Excel 2003 Sorting And Filtering
Microsoft Office Excel 2003 Sorting And Filtering
 
Implementing Auditing in SQL Server
Implementing Auditing in SQL ServerImplementing Auditing in SQL Server
Implementing Auditing in SQL Server
 
Parameters in Tableau
Parameters in TableauParameters in Tableau
Parameters in Tableau
 
IBM Pure Data System for Analytics (Netezza)
IBM Pure Data System for Analytics (Netezza)IBM Pure Data System for Analytics (Netezza)
IBM Pure Data System for Analytics (Netezza)
 
Bankreconciliationconfiguration[1]
Bankreconciliationconfiguration[1]Bankreconciliationconfiguration[1]
Bankreconciliationconfiguration[1]
 
AX 2012 R3 Installation Guide
AX 2012 R3 Installation GuideAX 2012 R3 Installation Guide
AX 2012 R3 Installation Guide
 
MySQL Hash Table
MySQL Hash TableMySQL Hash Table
MySQL Hash Table
 
Call transaction method
Call transaction methodCall transaction method
Call transaction method
 
Fi to mm integration by Naga srinivas irrinki 9550292839
Fi to mm integration by Naga srinivas irrinki 9550292839Fi to mm integration by Naga srinivas irrinki 9550292839
Fi to mm integration by Naga srinivas irrinki 9550292839
 
Table sap sd
Table sap sdTable sap sd
Table sap sd
 
411226987-SAP-MM-Implementation-Project (1).pdf
411226987-SAP-MM-Implementation-Project (1).pdf411226987-SAP-MM-Implementation-Project (1).pdf
411226987-SAP-MM-Implementation-Project (1).pdf
 
Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...
Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...
Getting started with tds in tally.erp 9 | Tally Downloads | Tally Support | T...
 
SQL
SQLSQL
SQL
 

Ähnlich wie How to import 1 million SKUs in under 10 minutes

SQL Server - Full text search
SQL Server - Full text searchSQL Server - Full text search
SQL Server - Full text searchPeter Gfader
 
Scale Your Data Tier With Windows Server App Fabric
Scale Your Data Tier With Windows Server App FabricScale Your Data Tier With Windows Server App Fabric
Scale Your Data Tier With Windows Server App FabricChris Dufour
 
MET CS 669 Database Design and Implementation for BusinessLab .docx
MET CS 669 Database Design and Implementation for BusinessLab .docxMET CS 669 Database Design and Implementation for BusinessLab .docx
MET CS 669 Database Design and Implementation for BusinessLab .docxbuffydtesurina
 
KSQL - Stream Processing simplified!
KSQL - Stream Processing simplified!KSQL - Stream Processing simplified!
KSQL - Stream Processing simplified!Guido Schmutz
 
Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)GOG.com dev team
 
Microsoft Windows Server AppFabric
Microsoft Windows Server AppFabricMicrosoft Windows Server AppFabric
Microsoft Windows Server AppFabricMark Ginnebaugh
 
Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...
Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...
Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...Codemotion
 
Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016
Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016
Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016Luigi Dell'Aquila
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKYoungHeon (Roy) Kim
 
Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...
Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...
Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...Trivadis
 
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowDBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowAlex Zaballa
 
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowDBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowAlex Zaballa
 
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowDBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowAlex Zaballa
 
Oracle 10g Performance: chapter 00 sampling
Oracle 10g Performance: chapter 00 samplingOracle 10g Performance: chapter 00 sampling
Oracle 10g Performance: chapter 00 samplingKyle Hailey
 
Pieter De Baets - An introduction to React Native
Pieter De Baets - An introduction to React NativePieter De Baets - An introduction to React Native
Pieter De Baets - An introduction to React Nativetlv-ios-dev
 
What's new in Cassandra 2.0
What's new in Cassandra 2.0What's new in Cassandra 2.0
What's new in Cassandra 2.0iamaleksey
 
Tony jambu (obscure) tools of the trade for tuning oracle sq ls
Tony jambu   (obscure) tools of the trade for tuning oracle sq lsTony jambu   (obscure) tools of the trade for tuning oracle sq ls
Tony jambu (obscure) tools of the trade for tuning oracle sq lsInSync Conference
 
Introduction to Oracle Database.pptx
Introduction to Oracle Database.pptxIntroduction to Oracle Database.pptx
Introduction to Oracle Database.pptxSiddhantBhardwaj26
 

Ähnlich wie How to import 1 million SKUs in under 10 minutes (20)

SQL Server - Full text search
SQL Server - Full text searchSQL Server - Full text search
SQL Server - Full text search
 
Scale Your Data Tier With Windows Server App Fabric
Scale Your Data Tier With Windows Server App FabricScale Your Data Tier With Windows Server App Fabric
Scale Your Data Tier With Windows Server App Fabric
 
MET CS 669 Database Design and Implementation for BusinessLab .docx
MET CS 669 Database Design and Implementation for BusinessLab .docxMET CS 669 Database Design and Implementation for BusinessLab .docx
MET CS 669 Database Design and Implementation for BusinessLab .docx
 
KSQL - Stream Processing simplified!
KSQL - Stream Processing simplified!KSQL - Stream Processing simplified!
KSQL - Stream Processing simplified!
 
Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)Event sourcing w PHP (by Piotr Kacała)
Event sourcing w PHP (by Piotr Kacała)
 
Xml4js pentaho
Xml4js pentahoXml4js pentaho
Xml4js pentaho
 
Microsoft Windows Server AppFabric
Microsoft Windows Server AppFabricMicrosoft Windows Server AppFabric
Microsoft Windows Server AppFabric
 
Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...
Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...
Geospatial Graphs made easy with OrientDB - Luigi Dell'Aquila - Codemotion Mi...
 
Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016
Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016
Geospatial Graphs made easy with OrientDB - Codemotion Milan 2016
 
MySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELKMySQL Audit using Percona audit plugin and ELK
MySQL Audit using Percona audit plugin and ELK
 
Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...
Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...
Trivadis TechEvent 2016 Useful Oracle 12c Features for Data Warehousing by Da...
 
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowDBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
 
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowDBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
 
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should KnowDBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
DBA Brasil 1.0 - DBA Commands and Concepts That Every Developer Should Know
 
Oracle 10g Performance: chapter 00 sampling
Oracle 10g Performance: chapter 00 samplingOracle 10g Performance: chapter 00 sampling
Oracle 10g Performance: chapter 00 sampling
 
Pieter De Baets - An introduction to React Native
Pieter De Baets - An introduction to React NativePieter De Baets - An introduction to React Native
Pieter De Baets - An introduction to React Native
 
What's new in Cassandra 2.0
What's new in Cassandra 2.0What's new in Cassandra 2.0
What's new in Cassandra 2.0
 
Tony jambu (obscure) tools of the trade for tuning oracle sq ls
Tony jambu   (obscure) tools of the trade for tuning oracle sq lsTony jambu   (obscure) tools of the trade for tuning oracle sq ls
Tony jambu (obscure) tools of the trade for tuning oracle sq ls
 
Overview of Oracle database12c for developers
Overview of Oracle database12c for developersOverview of Oracle database12c for developers
Overview of Oracle database12c for developers
 
Introduction to Oracle Database.pptx
Introduction to Oracle Database.pptxIntroduction to Oracle Database.pptx
Introduction to Oracle Database.pptx
 

Mehr von Ivan Chepurnyi

Optimizing Magento by Preloading Data
Optimizing Magento by Preloading DataOptimizing Magento by Preloading Data
Optimizing Magento by Preloading DataIvan Chepurnyi
 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceMeet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceIvan Chepurnyi
 
Varnish Cache and its usage in the real world!
Varnish Cache and its usage in the real world!Varnish Cache and its usage in the real world!
Varnish Cache and its usage in the real world!Ivan Chepurnyi
 
Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Ivan Chepurnyi
 
Hidden Secrets of Magento Price Rules
Hidden Secrets of Magento Price RulesHidden Secrets of Magento Price Rules
Hidden Secrets of Magento Price RulesIvan Chepurnyi
 
Magento 2.0: Prepare yourself for a new way of module development
Magento 2.0: Prepare yourself for a new way of module developmentMagento 2.0: Prepare yourself for a new way of module development
Magento 2.0: Prepare yourself for a new way of module developmentIvan Chepurnyi
 
Using of TDD practices for Magento
Using of TDD practices for MagentoUsing of TDD practices for Magento
Using of TDD practices for MagentoIvan Chepurnyi
 

Mehr von Ivan Chepurnyi (8)

Optimizing Magento by Preloading Data
Optimizing Magento by Preloading DataOptimizing Magento by Preloading Data
Optimizing Magento by Preloading Data
 
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for PerformanceMeet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
Meet Magento Sweden - Magento 2 Layout and Code Compilation for Performance
 
Varnish Cache and its usage in the real world!
Varnish Cache and its usage in the real world!Varnish Cache and its usage in the real world!
Varnish Cache and its usage in the real world!
 
Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)Making Magento flying like a rocket! (A set of valuable tips for developers)
Making Magento flying like a rocket! (A set of valuable tips for developers)
 
Hidden Secrets of Magento Price Rules
Hidden Secrets of Magento Price RulesHidden Secrets of Magento Price Rules
Hidden Secrets of Magento Price Rules
 
Magento 2.0: Prepare yourself for a new way of module development
Magento 2.0: Prepare yourself for a new way of module developmentMagento 2.0: Prepare yourself for a new way of module development
Magento 2.0: Prepare yourself for a new way of module development
 
Magento Indexes
Magento IndexesMagento Indexes
Magento Indexes
 
Using of TDD practices for Magento
Using of TDD practices for MagentoUsing of TDD practices for Magento
Using of TDD practices for Magento
 

Kürzlich hochgeladen

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfOrbitshub
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingEdi Saputra
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistandanishmna97
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 

Kürzlich hochgeladen (20)

AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 

How to import 1 million SKUs in under 10 minutes

  • 1. How to import 1 million SKUs in under 10 minutes 1/26
  • 2. Building an import correctly is hard 2/26
  • 3. 2008 it all started with DataFlow 3/26
  • 6. DataFlow Stores CSV records into database Imports product by product via AJAX call 4/26
  • 7. DataFlow Stores CSV records into database Imports product by product via AJAX call Uses product model to save data 4/26
  • 8. DataFlow Stores CSV records into database Imports product by product via AJAX call Uses product model to save data Closing the browser window stops the whole process 4/26
  • 10. Speed 2-3 products per second ~ 20 minutes for 5k products 5/26
  • 13. ImportExport Stored batches of data into the database during validation 7/26
  • 14. ImportExport Stored batches of data into the database during validation Processes stored data in one HTTP request 7/26
  • 15. ImportExport Stored batches of data into the database during validation Processes stored data in one HTTP request Validates product data without using product model 7/26
  • 16. ImportExport Stored batches of data into the database during validation Processes stored data in one HTTP request Validates product data without using product model Uses multi-row inserts to populate tables 7/26
  • 17. ImportExport Stored batches of data into the database during validation Processes stored data in one HTTP request Validates product data without using product model Uses multi-row inserts to populate tables Does not run indexers 7/26
  • 18. Speed 41 product per second 8/26
  • 19. Speed 41 product per second ~ 2 minutes for 5k products 8/26
  • 20. But there are some drawbacks 9/26
  • 21. High memory usage on large datasets But there are some drawbacks 9/26
  • 22. High memory usage on large datasets Slow in generating primary keys for new products But there are some drawbacks 9/26
  • 25. Same base functionality as in M1 ImportExport M2 11/26
  • 26. Same base functionality as in M1 More complex file format to edit and parse ImportExport M2 11/26
  • 27. Same base functionality as in M1 More complex file format to edit and parse Slower on complex product data ImportExport M2 11/26
  • 28. Same base functionality as in M1 More complex file format to edit and parse Slower on complex product data Adds additional single statement inserts ImportExport M2 11/26
  • 29. 2019 I got an idea and a project to implement it on 12/26
  • 31. Separate Feeds Main entity (sku, type, set) 13/26
  • 32. Separate Feeds Main entity (sku, type, set) Attributes (sku, attribute, store, value) 13/26
  • 33. Separate Feeds Main entity (sku, type, set) Attributes (sku, attribute, store, value) Category (sku, category slug, position) 13/26
  • 34. Separate Feeds Main entity (sku, type, set) Attributes (sku, attribute, store, value) Category (sku, category slug, position) Configurable Options (sku, attribute, label) 13/26
  • 35. Separate Feeds Main entity (sku, type, set) Attributes (sku, attribute, store, value) Category (sku, category slug, position) Configurable Options (sku, attribute, label) Images (sku, image) 13/26
  • 36. Separate Feeds Main entity (sku, type, set) Attributes (sku, attribute, store, value) Category (sku, category slug, position) Configurable Options (sku, attribute, label) Images (sku, image) ... 13/26
  • 38. Lazy Entity Resolving Reduce memory requirements of the import 14/26
  • 39. Lazy Entity Resolving Reduce memory requirements of the import Cleaner and more readable feed processing 14/26
  • 40. Lazy Entity Resolving Reduce memory requirements of the import Cleaner and more readable feed processing Possibility of acquiring entity ids in batches automatically 14/26
  • 41. Lazy Entity Resolving $resolver = $this->resolverFactory->createSingleValueResolver( 'catalog_product_entity', 'sku', 'entity_id' );   $insert = InsertOnDuplicate::create( 'catalog_product_entity_varchar', ['entity_id', 'attribute_id', 'store_id', 'value'] )->withResolver($resolver);   $insert ->withRow($resolver->unresolved('sku1'), 1, 0, 'some value') ->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1') ->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2'); 15/26
  • 42. Configure table lookup information Lazy Entity Resolving $resolver = $this->resolverFactory->createSingleValueResolver( 'catalog_product_entity', 'sku', 'entity_id' );   $insert = InsertOnDuplicate::create( 'catalog_product_entity_varchar', ['entity_id', 'attribute_id', 'store_id', 'value'] )->withResolver($resolver);   $insert ->withRow($resolver->unresolved('sku1'), 1, 0, 'some value') ->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1') ->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2'); 15/26
  • 43. Pass resolver into insert builder Lazy Entity Resolving $insert = InsertOnDuplicate::create( 'catalog_product_entity_varchar', ['entity_id', 'attribute_id', 'store_id', 'value'] )->withResolver($resolver); $resolver = $this->resolverFactory->createSingleValueResolver( 'catalog_product_entity', 'sku', 'entity_id' );     $insert ->withRow($resolver->unresolved('sku1'), 1, 0, 'some value') ->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1') ->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2'); 15/26
  • 44. Use resolver to create identifier containers Lazy Entity Resolving ->withRow($resolver->unresolved('sku1'), 1, 0, 'some value') ->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1') ->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2'); $resolver = $this->resolverFactory->createSingleValueResolver( 'catalog_product_entity', 'sku', 'entity_id' );   $insert = InsertOnDuplicate::create( 'catalog_product_entity_varchar', ['entity_id', 'attribute_id', 'store_id', 'value'] )->withResolver($resolver);   $insert 15/26
  • 45. Insert on duplicate will skip any unresolved entries Lazy Entity Resolving $resolver = $this->resolverFactory->createSingleValueResolver( 'catalog_product_entity', 'sku', 'entity_id' );   $insert = InsertOnDuplicate::create( 'catalog_product_entity_varchar', ['entity_id', 'attribute_id', 'store_id', 'value'] )->withResolver($resolver);   $insert ->withRow($resolver->unresolved('sku1'), 1, 0, 'some value') ->withRow($resolver->unresolved('sku2'), 1, 0, 'some value1') ->withRow($resolver->unresolved('sku3'), 1, 0, 'some value2'); 15/26
  • 46. 16/26
  • 47. Batch auto-increment generation START TRANSACTION;   INSERT INTO catalog_product_entity (sku) VALUES ('sku1'), ('sku2'), ('sku3'), ('sku4');   SELECT entity_id, sku FROM catalog_product_entity WHERE sku IN ('sku1', 'sku2', 'sku3', 'sku4');   ROLLBACK; 17/26
  • 48. Start a transaction Batch auto-increment generation START TRANSACTION;   INSERT INTO catalog_product_entity (sku) VALUES ('sku1'), ('sku2'), ('sku3'), ('sku4');   SELECT entity_id, sku FROM catalog_product_entity WHERE sku IN ('sku1', 'sku2', 'sku3', 'sku4');   ROLLBACK; 17/26
  • 49. Populate table with un-resolved keys Batch auto-increment generation   INSERT INTO catalog_product_entity (sku) VALUES ('sku1'), ('sku2'), ('sku3'), ('sku4');   START TRANSACTION; SELECT entity_id, sku FROM catalog_product_entity WHERE sku IN ('sku1', 'sku2', 'sku3', 'sku4');   ROLLBACK; 17/26
  • 50. Retrieve new identifiers Batch auto-increment generation SELECT entity_id, sku FROM catalog_product_entity WHERE sku IN ('sku1', 'sku2', 'sku3', 'sku4');   START TRANSACTION;   INSERT INTO catalog_product_entity (sku) VALUES ('sku1'), ('sku2'), ('sku3'), ('sku4');   ROLLBACK; 17/26
  • 51. Rollback transaction Batch auto-increment generation ROLLBACK; START TRANSACTION;   INSERT INTO catalog_product_entity (sku) VALUES ('sku1'), ('sku2'), ('sku3'), ('sku4');   SELECT entity_id, sku FROM catalog_product_entity WHERE sku IN ('sku1', 'sku2', 'sku3', 'sku4');   17/26
  • 53. Compile query for constant batch size Prepared Statements 18/26
  • 54. Compile query for constant batch size Send only data instead of generating new queries Prepared Statements 18/26
  • 55. Compile query for constant batch size Send only data instead of generating new queries Reduces query processing on MySQL side by half Prepared Statements 18/26
  • 56. Speed 450 products per second 19/26
  • 57. Speed 450 products per second ~ 11 seconds for 5k products 19/26
  • 58. But it was still not good enough 20/26
  • 59. But it was still not good enough 45 minutes to import 1 million SKUs 20/26
  • 60. Sure, because it's a sequential process... 21/26
  • 61. So I made it asynchronous as PoC 22/26
  • 63. Under the hood Each target tabletarget table receives a separate connection to MySQL 23/26
  • 64. Under the hood Each target tabletarget table receives a separate connection to MySQL Identity resolver is attached to the source table connection 23/26
  • 65. Under the hood Each target tabletarget table receives a separate connection to MySQL Identity resolver is attached to the source table connection Each feed is processed concurrently by using round robinround robin strategy 23/26
  • 66. Under the hood Each target tabletarget table receives a separate connection to MySQL Identity resolver is attached to the source table connection Each feed is processed concurrently by using round robinround robin strategy During MySQL query execution PHP prepares the next batch 23/26
  • 67. Speed 1,850 products per second 24/26
  • 68. Speed 1,850 products per second ~ 9 minutes for 1m products 24/26
  • 69. It is coming this fall as an open source tool for everyone! 25/26