(response NOT top-posted. see below...)
Dale Roddy <[EMAIL PROTECTED]> wrote on 02/24/2005 05:40:22 PM:
> I am new to MySql. I have a query with a subselect that is running
> very slow (28 seconds).
>
> SELECT *,MATCH(title, descr_part) AGAINST ("Project Manager" IN
> BOOLEAN MODE) AS score
> FROM listings
> WHERE MATCH(title, descr_part) AGAINST ("Project Manager" IN BOOLEAN
MODE )
> and zip in
> (SELECT zipcode FROM zipData
> WHERE (POW((69.1*(lon-37.57348)*cos(122.3225/57.3)),2)+POW((69.
> 1*(lat-122.3225)),2))<(10*10)
> )
> limit 10;
>
>
> Both tables do have a lot of Records. When I run them seperatly, they
> are both very fast (see below). As stated above, I am very new to
> this, so please be gentel. ;-) Any sugestions on how to do this
> better/different would be greatlfuly appreciated.
>
>
>
>
> Table 1 (listings);
> +-------------+--------------+------+-----+---------+----------------+
> | Field | Type | Null | Key | Default | Extra |
> +-------------+--------------+------+-----+---------+----------------+
> | lst_id | bigint(20) | | PRI | NULL | auto_increment |
> | cat_id | bigint(20) | | | 0 | |
> | sub_cat_id | bigint(20) | | | 0 | |
> | mem_id | bigint(20) | | | 0 | |
> | trb_id | bigint(20) | | | 0 | |
> | added | bigint(20) | | | 0 | |
> | title | varchar(250) | | MUL | | |
> | description | text | | | | |
> | descr_part | varchar(250) | | MUL | | |
> | photo | varchar(250) | | | | |
> | privacy | char(1) | | | n | |
> | anonim | char(1) | | | n | |
> | zip | int(10) | | MUL | 0 | |
> | show_deg | char(3) | | | any | |
> | stat | char(1) | | | p | |
> | live | bigint(20) | | | 0 | |
> +-------------+--------------+------+-----+---------+----------------+
>
> Table 2 (zipdata);
> +---------+--------------+------+-----+---------+-------+
> | Field | Type | Null | Key | Default | Extra |
> +---------+--------------+------+-----+---------+-------+
> | country | bigint(20) | | | 0 | |
> | zipcode | varchar(5) | | PRI | | |
> | lon | varchar(8) | | MUL | | |
> | lat | varchar(8) | | MUL | | |
> | city | varchar(250) | | MUL | | |
> | state | char(3) | | MUL | | |
> +---------+--------------+------+-----+---------+-------+
>
>
> Query 1 : SELECT zipcode FROM zipData WHERE
> (POW((69.1*(lon-"37.57348")*cos(122.3225/57.3)),"2")+POW((69.
> 1*(lat-"122.3225")),"2"))<(5*5);
> +---------+
> | zipcode |
> +---------+
> | 94002 |
> | 94010 |
> | 94070 |
> | 94401 |
> | 94402 |
> | 94403 |
> | 94404 |
> | 94497 |
> +---------+
> 8 rows in set (0.33 sec)
>
> Query 2 SELECT *, MATCH(title, descr_part) AGAINST ("manager" IN
> BOOLEAN MODE) AS score FROM listings WHERE MATCH(title, descr_part)
> AGAINST ("manager" IN BOOLEAN MODE ) limit 5;
>
> Won't put all the output here but here is an example....
> | 93 | 9000 | 9001 | 63 | 0 | 1109027856 |
> Architect project manager | ARCHITECTS Do you fearlessly create? Do
> you intelligently realize? Do you collaboratively develop? We do. Come
> join us! Looking for designers (Architects & Interiors) that want to
> make a difference. ...<br>Please visit <a
> href="http://www.careersite.
> com/perl/vaui/Search/top/job/9F064-1B68B?pid=295&matches.page=5"><b>THIS
> LINK </b></a>for more information and to apply.<br> | ARCHITECTS Do
> you fe | no | n | n | 95401 | any | a | 2592000
> | 1 |
> +--------+--------+------------+--------+--------+------------
> +---------------------------
>
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
> +----------------------+-------+---------+--------+-------
> +----------+------+---------+-------+
> 5 rows in set (0.00 sec)
>
>
> Explain for query 1:
>
> +----+-------------+---------+-------+---------------+-------------
> +---------+------+-------+--------------------------+
> | id | select_type | table | type | possible_keys | key |
> key_len | ref | rows | Extra |
> +----+-------------+---------+-------+---------------+-------------
> +---------+------+-------+--------------------------+
> | 1 | SIMPLE | zipData | index | NULL | zip_lat_lon |
> 21 | NULL | 42037 | Using where; Using index |
> +----+-------------+---------+-------+---------------+-------------
> +---------+------+-------+--------------------------+
>
>
>
> Explain for Query 2:
> MODE) AS score FROM listings WHERE MATCH(title, descr_part) AGAINST
> ("manager" IN BOOLEAN MODE ) limit 5;
> +----+-------------+----------+----------+---------------------
> +---------------------+---------+------+------+-------------+
> | id | select_type | table | type | possible_keys | key
> | key_len | ref | rows | Extra |
> +----+-------------+----------+----------+---------------------
> +---------------------+---------+------+------+-------------+
> | 1 | SIMPLE | listings | fulltext | title_desc_part_txt |
> title_desc_part_txt | 0 | | 1 | Using where |
> +----+-------------+----------+----------+---------------------
> +---------------------+---------+------+------+-------------+
> 1 row in set (0.02 sec)
>
>
> Explaine for Full(SLOW) Query.....
> mysql> explain SELECT *,MATCH(title, descr_part) AGAINST ("Project
> Manager" IN BOOLEAN MODE) AS score FROM listings WHERE
> MATCH(title, descr_part) AGAINST ("Project Manager" IN BOOLEAN MODE )
> and zip in (SELECT zipcode FROM zipData WHERE
> (POW((69.1*(lon-37.57348)*cos(122.3225/57.3)),2)+POW((69.1*(lat-122.
> 3225)),2))<(10*10)
> ) limit 10;
> +----+--------------------+----------+----------
> +---------------------+---------------------+---------+------
> +-------+--------------------------+
> | id | select_type | table | type | possible_keys
> | key | key_len | ref | rows | Extra
> |
> +----+--------------------+----------+----------
> +---------------------+---------------------+---------+------
> +-------+--------------------------+
> | 1 | PRIMARY | listings | fulltext | title_desc_part_txt
> | title_desc_part_txt | 0 | | 1 | Using where
> |
> | 2 | DEPENDENT SUBQUERY | zipData | index | zipcode,zip_lat_lon
> | zip_lat_lon | 21 | NULL | 42037 | Using where; Using
> index |
> +----+--------------------+----------+----------
> +---------------------+---------------------+---------+------
> +-------+--------------------------+
>
I would separate your query into two steps and use a JOIN rather than a
subquery.
CREATE TEMPORARY TABLE tmpZips
SELECT zipcode FROM zipData
WHERE POW((69.1*(lon-"37.57348") * cos(122.3225/57.3)),"2") +
POW((69.1*(lat-"122.3225")),"2"))<(5*5);
SELECT *,MATCH(title, descr_part) AGAINST ("Project Manager" IN BOOLEAN
MODE) AS score
FROM listings
INNER JOIN tmpZips
ON tmpZips.zipcode = listings.zip
WHERE MATCH(title, descr_part) AGAINST ("Project Manager" IN BOOLEAN MODE
);
DROP TABLE tmpZips;
See how well that performs over your other query.
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine