here is the updated select statement i came with but still needs improvement

SELECT Distinct (a.id)
>From table1 a 
INNER JOIN table1 b
USING ( p_id ) 
INNER JOIN table2 c
USING ( p_id ) 
INNER JOIN table3 d
USING ( out_id ) 
INNER JOIN table4 e ON ( d.name_id = e.name_id ) 
INNER JOIN table4 f  ON ( e.start_id
BETWEEN f.left_id AND f.end_id ) 
WHERE (f.name_id =45 OR f.name_id =56)
AND b.id =275 AND a.id != b.id 

This reduced the time from 0.5 secs to 0.3 secs but still i am looking for some major 
improvemnts. I am using this query in PHP and its been repeated several times to 
display a list. Any advice on this will be really useful. Is there anything I could 
do with the mysql and php configuration to increase the performance? The server has 
just 1GB ram, will adding more memory help? 

Thanks
Karthik.

> Need help on optimizing the select statement:
> 
> Table structure
> 
> table1
> ------
> id 
> p_id 
> 
> table2
> ------
> p_id 
> out_id 
> 
> table3
> ------
> out_id
> name_id
> 
> table4
> -------
> name_id (unique)
> prev_id
> start_id (unique)
> end_id (unique)
> 
> Only table4 has unique fields all other fields are not unique.
> 
> The following select statement does what is required but the tables are really
> huge 
> (> 50 million records) so need to be optimized
> 
> SELECT DISTINCT (a.id)
> FROM table1 a, table1 b, table2 c, table3 d, table4 e, table4 f
> WHERE a.id =275 AND a.p_id = b.p_id AND a.id != b.id 
>   AND a.p_id = c.p_id AND c.out_id = d.out_id AND d.name_id = e.name_id 
>   AND e.start_id >= f.start_id AND e.end_id <= f.end_id AND e.end_id !=0 
>   AND (f.name_id =45 OR f.name_id =56) 
> GROUP BY b.id
> 
> The explain for the above statement is
> 
> a | ref | id,p_id,combine | combine | 4 | const | 5281 | Using where; Using
> index; 
> Using temporary; Using f...  
> c | eq_ref | PRIMARY,p_id | PRIMARY | 4 | a.p_id | 1 |  |  | 
> d | ref | name_id,out_id | out_id | 4 | b.out_id | 1 |  |  | 
> b | ref | p_id | p_id | 4 | a.p_id | 3 | Using where | 
> e | range | PRIMARY,start_id,end_id,combine,name_id | PRIMARY | 4 | NULL | 2 |
> Using 
> where | 
> f | eq_ref | PRIMARY,start_id,end_id,combine,name_id | PRIMARY | 4 | c.name_id |

> 1 | 
> Using where | 
> 
> I am sure there should be some better way to do this using Inner join or
> something 
> similar but I am not sure how. It will be helpful if you could suggest me some 
> improvements for this query. If you need any further explanation please let me
> know.
> 
> Thanks for your help
> Karu.
> 
> 
> 
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
> 






-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to