I saw the same that ms sql is faster but I think it's because of the ms sql makes better use of index's I had a table with almos 300mil records on ms sql query with index'es it was no problem (in about 5 min I got the result) and with a much smaller db on mysql (with 80 mil records it took almost 30 min this with the same index'es)
If this are query's only for report purpuse I would say go for MySQL (much cheaper) and if it's production and this query must be diplay'd every x min then keep with MS SQL. And if the NULL value are on a varchar based field I said use NULL otherwise it's make no different (on MS SQL) Best Regards, HuMPie @ Grunn.Org mrtg.grunn.org Dutch mirror of MRTG www.webdns.info Dutch private DNS hoster =========================================== Motto: Writing software is more fun than working. =========================================== Disclaimer: All you do with the suggestion in this mail is you responsibillity even if your system will crash :) -----Original Message----- From: Chris Fossenier [mailto:[EMAIL PROTECTED] Sent: maandag 23 februari 2004 18:16 To: [EMAIL PROTECTED] Subject: MySQL versus MS SQL Hello, This is a long post, my apologies. I have been working on migrating a database from MS SQL to MySQL for about 1 month now and am at a point where I can start running some tests to see how they compare. I'll provide a little background to help you out. The MS SQL database is 120million records long and 400 fields wide. It's all in one table with 19 indexes. There is a cluster index on the ZIP code field. This database is running on a DELL dual Xeon (MHz 2MB cpu cache, 4GB RAM), DELL Powervault RAID5 storage array. My initial plan was to simply move the big db/table structure from MS SQL to MySQL but we found that indexing was a roadblock. The indexes (after 3 of them) would start to take longer and longer. We are still performing testing on this as it's possible that some of our hardware (DELL 8450s) may have issues running with an EMC Symmetrix RAID0+1. In the end, we normalized the data into 17 tables with no more than 3 indexes per table. The MySQL database is 106million records (we got rid of some duplicates) long and 250 fields (we got rid of some unused fields) wide. As mentioned above, it's in 17 tables. This database is running on a HP quad Xeon (500MHz 512MB cpu cache, 8GB RAM), EMC Symmetrix storage array. I am including the queries in this post to see if anyone has any advice on what we could do to make these queries run faster. I realize that the hardware isn't identical but I think it's close enough to get somewhat accurate comparisons. Here are the queries. the first query in each case is the MS SQL query. The second query is the MySQL query. At the beginning section for the queries, I indicate which fields are indexed (it's the same for both tables). MS SQL beats MySQL handily except for one query and I'm not sure why. All queries were run as the only process on each server. QUERY1 ~~~~~~~~~~~ Indexed Fields (link, phone_pander,state, exact_age, estimated_age, phone, first, last, address) MS SQL QUERY (TIME TO COMPLETE: 21m33s) SELECT phone,first,last,address,address2,city,state,zip,plus4,county,phone_pand er_f lag,homeowner,probable_homeowner,homeowner_probability_model,exact_age,e stim ated_age FROM consumer1 WHERE phone_pander_flag <> 'Y' AND STATE = 'PA' AND (homeowner = 'Y' OR probable_homeowner IN ('8','9') OR homeowner_probability_model BETWEEN '080' AND '102') AND (exact_age BETWEEN '40' AND '60' OR estimated_age BETWEEN '40' AND '60') AND phone > ' ' AND first > ' ' AND last > ' ' AND address > ' '; MySQL QUERY(TIME TO COMPLETE: 42m27s) SELECT a1.phone, p1a.first, p1a.last, a3.address, a1.address2, a1.city, state.state, a2.zip, a1.plus4, a3.county, a1.phone_pander_flag, h1.homeowner, h2.probable_homeowner, h2.homeowner_probability_model, p1c.exact_age, p1c.estimated_age FROM a1 INNER JOIN a2 on a2.link = a1.link INNER JOIN a3 on a3.link = a1.link INNER JOIN h1 on h1.link = a1.link INNER JOIN h2 on h2.link = a1.link INNER JOIN p1a on p1a.link = a1.link INNER JOIN p1c on p1c.link = a1.link INNER JOIN state on state.state_code = a2.state_code WHERE a1.phone_pander_flag <> 'Y' AND state.state = 'PA' AND ( h1.homeowner = 'Y' OR h2.probable_homeowner IN ('8','9') OR h2.homeowner_probability_model BETWEEN '080' AND '102' ) AND ( p1c.exact_age BETWEEN '40' AND '60' OR estimated_age BETWEEN '40' AND '60' ) AND a1.phone is not null AND p1a.first is not null AND p1a.last is not null AND a3.address is not null; QUERY2 ~~~~~~~~ Indexed Fields (link, zip, phone_pander,phone, first, last, address) MS SQL QUERY(12 seconds) SELECT phone,first,last,address,address2,city,state,zip,plus4,county,phone_pand er_f lag,homeowner,probable_homeowner,homeowner_probability_model,number_of_u nits ,primary_ethnic_market_code,household_hispanic FROM consumer1 WHERE zip in ('60402','60650','60607','60608','60612','60622') AND phone_pander_flag<>'y' AND (homeowner='y' OR probable_homeowner in ('8','9') OR homeowner_probability_model BETWEEN '080' AND '102') AND phone > ' ' AND first > ' ' AND last > ' ' AND address > ' ' AND number_of_units IN ('0001','0002') AND (primary_ethnic_market_code='38' OR household_hispanic>='0850') MySQL QUERY(10min51secs) SELECT a1.phone, p1a.first, p1a.last, a3.address, a1.address2, a1.city, state.state, a2.zip, a1.plus4, a3.county, a1.phone_pander_flag, h1.homeowner, h2.probable_homeowner, h2.homeowner_probability_model, a1.number_of_units, p1a.primary_ethnic_market_code, c2k.2000_census_hispanic FROM a1 INNER JOIN a2 on a2.link = a1.link INNER JOIN a3 on a3.link = a1.link INNER JOIN h1 on h1.link = a1.link INNER JOIN h2 on h2.link = a1.link INNER JOIN p1a on p1a.link = a1.link INNER JOIN c2k on c2k.link = a1.link INNER JOIN state on state.state_code = a2.state_code WHERE a2.zip in ('60402', '60650', '60607', '60608', '60612', '60622') AND a1.phone_pander_flag <> 'Y' AND ( h1.homeowner='Y' OR h2.probable_homeowner in ('8','9') OR h2.homeowner_probability_model BETWEEN '080' AND '102') AND a1.phone is not null AND p1a.first is not null AND p1a.last is not null AND a3.address is not null AND a1.number_of_units IN ('0001','0002') AND ( p1a.primary_ethnic_market_code='38' OR c2k.2000_census_hispanic >='0850' ); QUERY3 ~~~~~~~~~ Indexed Fields (link, zip, phone_pander, phone, first, last, address) MS SQL QUERY(10seconds) SELECT phone,first,last,address,address2,city,state,zip,plus4,county,home_purch ase_ date,mortgage_amount_in_thousands,phone_pander_flag FROM consumer1 WHERE ZIP IN ('14221','14224','14226','14227','14051','14031','14057') AND phone_pander_flag <> 'Y' AND phone > ' ' AND first > ' ' AND last > ' ' AND address > ' ' AND MORTGAGE_AMOUNT_IN_THOUSANDS>='0075' AND SUBSTRING(HOME_PURCHASE_DATE,1,4)='2003' MySQL QUERY(5min22secs) SELECT a1.phone, p1a.first, p1a.last, a3.address, a1.address2, a1.city, state.state, a2.zip, a1.plus4, a3.county, h1.home_purchase_date, mtg.mortgage_amount_in_thousands, a1.phone_pander_flag FROM a1 INNER JOIN a2 on a2.link = a1.link INNER JOIN a3 on a3.link = a1.link INNER JOIN h1 on h1.link = a1.link INNER JOIN p1a on p1a.link = a1.link INNER JOIN mtg on mtg.link = a1.link INNER JOIN state on state.state_code = a2.state_code WHERE a2.zip IN ('14221', '14224', '14226', '14227', '14051', '14031', '14057') AND a1.phone_pander_flag <> 'Y' AND a1.phone is not null AND p1a.first is not null AND p1a.last is not null AND a3.address is not null AND mtg.mortgage_amount_in_thousands>='0075' AND (h1.home_purchase_date > '2003' and h1.home_purchase_date < '2004'); QUERY4 ~~~~~~~~~~ Indexed Fields (link, state, first, last, address) MS SQL QUERY(8hrs50mins) SELECT phone,first,last,address,address2,city,state,zip,plus4,county,mortgage_l oan_ type,mortgage_amount_in_thousands,home_purchase_price,home_purchase_date FROM consumer1 WHERE state IN ('PA','OH') AND first > ' ' AND last > ' ' AND address > ' ' AND mortgage_loan_type='V' AND (mortgage_amount_in_thousands>='0100' OR home_purchase_price>='0100000') AND home_purchase_date between '2002' and '2003' MySQL QUERY(2hrs17mins) SELECT a1.phone, p1a.first, p1a.last, a3.address, a1.address2, a1.city, state.state, a2.zip, a1.plus4, a3.county, mtg.mortgage_loan_type, mtg.mortgage_amount_in_thousands, h1.home_purchase_price, h1.home_purchase_date FROM a1 INNER JOIN a2 on a2.link = a1.link INNER JOIN a3 on a3.link = a1.link INNER JOIN h1 on h1.link = a1.link INNER JOIN p1a on p1a.link = a1.link INNER JOIN mtg on mtg.link = a1.link INNER JOIN state on state.state_code = a2.state_code WHERE state.state IN ('PA', 'OH') AND p1a.first is not null AND p1a.last is not null AND a3.address is not null AND mtg.mortgage_loan_type = 'V' AND (mtg.mortgage_amount_in_thousands>='0100' OR h1.home_purchase_price>='0100000') AND h1.home_purchase_date between '2002' and '2003'; QUERY5 ~~~~~~~~~~ Indexed Fields (link, state, first, last, address) MS SQL QUERY(27min28secs) SELECT phone,first,last,address,address2,city,state,zip,plus4,county,phone_pand er_f lag,number_of_units,dwelling_type,homeowner_probability_model,home_prope rty_ indicator FROM consumer1 WHERE state='FL' AND homeowner_probability_model<='020' AND first > ' ' AND last > ' ' AND address > ' ' AND (number_of_units>='0003' OR dwelling_type='A') AND home_property_indicator<>'2' MySQL QUERY(3hrs53mins) SELECT a1.phone, p1a.first, p1a.last, a3.address, a1.address2, a1.city, state.state, a2.zip, a1.plus4, a3.county, a1.phone_pander_flag, a1.number_of_units, h1.dwelling_type, h2.homeowner_probability_model, h1.home_property_indicator FROM a1 INNER JOIN a2 on a2.link = a1.link INNER JOIN a3 on a3.link = a1.link INNER JOIN h1 on h1.link = a1.link INNER JOIN h2 on h2.link = a1.link INNER JOIN p1a on p1a.link = a1.link INNER JOIN mtg on mtg.link = a1.link INNER JOIN state on state.state_code = a2.state_code WHERE state.state = 'FL' AND h2.homeowner_probability_model <= '020' AND p1a.first is not null AND p1a.last is not null AND a3.address is not null AND ( a1.number_of_units>='0003' OR h1.dwelling_type='A' ) AND h1.home_property_indicator <> '2'; Any and all help is appreciated. Thanks. Chris. -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]