Hi Fredrik,
a LEFT JOIN could be faster (I'm not sure, try it). And you don't have a
fulltext index on msg_header.list.
What about this?
SELECT msg_header.bodyid, msg_header.id, msg_header.subject,
msg_header.mfrom, msg_header.date, msg_header.list
FROM msg_header
LEFT JOIN msg_body ON msg_header.bodyid = msg_body.id
WHERE msg_header.list LIKE 'LISTNAME%'
AND MATCH(msg_body.body) AGAINST('WORD');
Regards, Thomas Spahni
On Fri, 20 Aug 2004, Fredrik Carlsson wrote:
> Hi all,
>
> I'm running a small mail archive and have a little problem with the
> fulltext search performance.
> I really appreciate any tips/design suggestions (even if it dont have to
> do with the search problem ;) ).
>
> Database schema:
>
> mysql> describe msg_header;
> +---------+--------------+------+-----+---------+----------------+
> | Field | Type | Null | Key | Default | Extra |
> +---------+--------------+------+-----+---------+----------------+
> | id | int(11) | | PRI | NULL | auto_increment |
> | parent | int(11) | YES | MUL | NULL | |
> | bodyid | int(11) | YES | | NULL | |
> | list | varchar(80) | YES | MUL | NULL | |
> | mfrom | varchar(80) | YES | | NULL | |
> | mto | varchar(80) | YES | | NULL | |
> | subject | varchar(200) | YES | MUL | NULL | |
> | mcc | varchar(80) | YES | | NULL | |
> | sdate | varchar(45) | YES | | NULL | |
> | batch | varchar(80) | YES | MUL | NULL | |
> | msgid | varchar(90) | YES | | NULL | |
> | date | datetime | YES | MUL | NULL | |
> +---------+--------------+------+-----+---------+----------------+
> 12 rows in set (0.00 sec)
>
>
> mysql> describe msg_body;
> +-------+---------+------+-----+---------+----------------+
> | Field | Type | Null | Key | Default | Extra |
> +-------+---------+------+-----+---------+----------------+
> | id | int(11) | | PRI | NULL | auto_increment |
> | body | text | YES | MUL | NULL | |
> +-------+---------+------+-----+---------+----------------+
> 2 rows in set (0.00 sec)
>
> index from msg_body;
>
> *************************** 1. row ***************************
> Table: msg_body
> Non_unique: 0
> Key_name: PRIMARY
> Seq_in_index: 1
> Column_name: id
> Collation: A
> Cardinality: 295996
> Sub_part: NULL
> Packed: NULL
> Null:
> Index_type: BTREE
> Comment:
> *************************** 2. row ***************************
> Table: msg_body
> Non_unique: 1
> Key_name: id
> Seq_in_index: 1
> Column_name: id
> Collation: A
> Cardinality: 295996
> Sub_part: NULL
> Packed: NULL
> Null:
> Index_type: BTREE
> Comment:
> *************************** 3. row ***************************
> Table: msg_body
> Non_unique: 1
> Key_name: body
> Seq_in_index: 1
> Column_name: body
> Collation: A
> Cardinality: 295996
> Sub_part: NULL
> Packed: NULL
> Null: YES
> Index_type: FULLTEXT
> Comment:
> 3 rows in set (0.00 sec)
>
>
> The search querys using fulltext indexes takes around > 1minute and no
> one want to use a search that slow :/
>
> The Query is the following:
>
> SELECT msg_header.bodyid,msg_header.id,
> msg_header.subject,msg_header.mfrom, msg_header.date, msg_header.list FROM
> msg_header,msg_body WHERE msg_header.bodyid=msg_body.id AND
> match(msg_header.list) against('LISTNAME')
> AND match(msg_body.body) AGAINST('WORD');
>
> For a couple of month ago the msg-body and msg-headers parts where in
> the same table and the fulltext search was really fast < 1 sec, but
> everything else just became slower so i splitted it upp in two tables.
> But now i need to match msg_header.bodyid against msg_body.id to be able
> to now witch body that belongs to with header and i think thats where
> things get slow..
>
> I ran an explain select query and the following result turned upp
>
> +------------+----------+-----------------+---------+---------+-------------------+------+-------------+
> | table | type | possible_keys | key | key_len |
> ref | rows | Extra |
> +------------+----------+-----------------+---------+---------+-------------------+------+-------------+
> | msg_header | fulltext | list_4 | list_4 | 0
> | | 1 | Using where |
> | msg_body | eq_ref | PRIMARY,id,body | PRIMARY | 4 |
> msg_header.bodyid | 1 | Using where |
> +------------+----------+-----------------+---------+---------+-------------------+------+-------------+
> Does this means that the fulltext index on msg_body.body is'nt being used?
>
> The machine is an Intel PIII 500Mhz, 512MB memory and IDE disks running
> NetBSD 1.6.3, mysql 4.0.20.
> The database contains about 300 000 rows and the size is ~1GB.
>
>
> // Fredrik Carlsson
>
>
>
>
>
>
>
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]