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]

Reply via email to