mysql - Is there any way to simplify union query while using multiple tables, with reference to main table ( Performance Optimization ) -


i wonder there way improve query, speed / simplify while using multiple tables union clause reference 1 main table.

following scenario, here table reference main table , geo_loc1,geo_loc2,geo_loc2 other tables, joined based on key1 , key2, these 2 keys exists in table.

select      reference.*,     geo_loc1.bathy,     geo_loc1.gravity,     geo_loc1.magnet,     'data1' type      reference,geo_loc1      reference.latitude between -30 , -10 ,      reference.longitude between 10 , 50 ,      date( reference.st_date ) between '2000-07-05' , '2011-11-10'  ,     reference.key1 = geo_loc1.key1 ,     reference.key2 = geo_loc1.key2 union select      reference.*,     geo_loc2.bathy,     null gravity,     geo_loc2.magnet,     'data2' type      reference,geo_loc2      reference.latitude between -30 , -10 ,      reference.longitude between 10 , 50 ,      date( reference.st_date ) between '2000-07-05' , '2011-11-10'  ,     reference.key1 = geo_loc2.key1 ,     reference.key2 = geo_loc2.key2 union select      reference.*,     null bathy,     null gravity,     geo_loc3.magnet,     'data3' type      reference,geo_loc3      reference.latitude between -30 , -10 ,      reference.longitude between 10 , 50 ,      date( reference.st_date ) between '2000-07-05' , '2011-11-10'  ,     reference.key1 = geo_loc3.key1 ,     reference.key2 = geo_loc3.key2 

whether query can simplified or improved ?

for performance can see 2 things might change.

1) change union union all. union check results duplicates adds overhead don't need.

2) consider changing date( reference.st_date ) between '2000-07-05' , '2011-11-10' not use date function.

if reference.st_date proper date column , didn't need type conversion db use index based on date quick lookup. doing type conversion db have scan conversion each row.

you index on key1,key2,st_date,latitude,longitude. using date function you're using first 2 columns of index. either change st_date date or change values you're comparing conversion isn't required.

also consider using proper inner join rather adding join conditions where clauses. it's more readable using proper syntax , less error prone.

example using union all , inner join should this. note untested should idea.
edit removed use of date() function should speed further

select      reference.*,     geo_loc1.bathy,     geo_loc1.gravity,     geo_loc1.magnet,     'data1' type      reference inner join geo_loc1 on     reference.key1 = geo_loc1.key1 ,     reference.key2 = geo_loc1.key2     reference.latitude between -30 , -10 ,      reference.longitude between 10 , 50 ,      reference.st_date between '2000-07-05 00:00:00' , '2011-11-10 23:59:59' union select      reference.*,     geo_loc2.bathy,     null gravity,     geo_loc2.magnet,     'data2' type      reference inner join geo_loc2 on     reference.key1 = geo_loc2.key1 ,     reference.key2 = geo_loc2.key2     reference.latitude between -30 , -10 ,      reference.longitude between 10 , 50 ,      reference.st_date between '2000-07-05 00:00:00' , '2011-11-10 23:59:59' union select      reference.*,     null bathy,     null gravity,     geo_loc3.magnet,     'data3' type      reference inner join geo_loc3 on     reference.key1 = geo_loc3.key1 ,     reference.key2 = geo_loc3.key2     reference.latitude between -30 , -10 ,      reference.longitude between 10 , 50 ,      reference.st_date between '2000-07-05 00:00:00' , '2011-11-10 23:59:59' 

Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -