Have you considered splitting this into two queries? One query can gather 
information from your token and token_ins tables. The other would join the 
first queries results to the other tables to complete your original query. 
Depending on your data, one of these subqueries should return a smaller 
set (fewer rows) and you should execute the smaller one FIRST. Because of 
that you may want to flip the order of execution of these queries around 
(modifying as appropriate for the new order) and check the cd, c, and d 
tables first and join those results to the t, ti, t2 and ti2 tables..... 
You will only know by testing.

CREATE TEMPORARY TABLE tmpTokens
SELECT ti.posi, ti.docid,ti.id
FROM tokens_ins ti, tokens t, tokens t2, tokens_ins ti2
WHERE ti.id=t.id 
AND ti2.id=t2.id 
AND t.docid=ti.docid 
AND t2.docid=ti2.docid 
AND t.docid=t2.docid 
AND t.word='faire' 
AND t2.word='présence' 
AND ti2.posi>=ti.posi-5 
AND ti2.posi<=ti.posi+5;

SELECT t.posi, t.docid, d.filename,
t.id, c.name 
FROM corpus_documents cd, corpus c, documents d,
tmpTokens t
WHERE c.corpusid=4 
AND cd.corpusid=c.corpusid 
AND cd.docid=d.docid 
AND t.docid=d.docid 

DROP TABLE tmpTokens

Yours,
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine


Patrick Drouin <[EMAIL PROTECTED]> wrote on 07/15/2004 11:36:18 AM:

> Hum,
> 
>  Well, I'm back with another one...  When adding a
> join to the previous query, it sloows down once again
> even though it retrieves less datat. Here's the info :
> 
> 
> mysql> explain SELECT ti.posi, ti.docid, d.filename,
> ti.id, c.name 
> FROM corpus_documents cd, corpus c, documents d,
> tokens_ins ti, tokens t, tokens t2, tokens_ins ti2
> WHERE c.corpusid=4 
> AND cd.corpusid=c.corpusid 
> AND cd.docid=d.docid 
> AND t.docid=d.docid 
> AND ti.id=t.id 
> AND ti2.id=t2.id 
> AND t.docid=ti.docid 
> AND t2.docid=ti2.docid 
> AND t.docid=t2.docid 
> AND t.word='faire' 
> AND t2.word='présence' 
> AND ti2.posi>=ti.posi-5 
> AND ti2.posi<=ti.posi+5;
> +-------+------
> +--------------------------------------------------------------
> +-------------------+---------+---------------+------
> +--------------------------+
> | table | type | possible_keys 
>                        | key               | key_len |
> ref           | rows | Extra  |
> +-------+------
> +--------------------------------------------------------------
> +-------------------+---------+---------------+------
> +--------------------------+
> | c     | ref  | PRIMARY,corpus_corpusid 
>                        | PRIMARY           |       3 |
> const         |    1 | Using where; Using index |
> | cd    | ref  | PRIMARY 
>                        | PRIMARY           |       3 |
> const         |    2 | Using where; Using index |
> | d     | ref  | PRIMARY,documents_docid 
>                        | PRIMARY           |       3 |
> cd.docid      |    3 | Using index  |
> | t     | ref  |
> PRIMARY,tokens_id,tokens_docid,tokens_word,tokens_word_docid
> | tokens_word_docid |      33 | const,d.docid |    1 |
> Using where  |
> | t2    | ref  |
> PRIMARY,tokens_id,tokens_docid,tokens_word,tokens_word_docid
> | tokens_word_docid |      33 | const,t.docid |    1 |
> Using where  |
> | ti    | ref  |
> PRIMARY,tokens_ins_id,tokens_ins_docid 
>       | tokens_ins_id     |       4 | t.id          | 
>  96 | Using where  |
> | ti2   | ref  |
> PRIMARY,tokens_ins_id,tokens_ins_posi,tokens_ins_docid
>       | tokens_ins_id     |       4 | t2.id         | 
>  96 | Using where  |
> +-------+------
> +--------------------------------------------------------------
> +-------------------+---------+---------------+------
> +--------------------------+
> 7 rows in set (0.00 sec)
> 
> Seems OK to me. But here's the query once run:
> 
> mysql> SELECT ti.posi, ti.docid, d.filename, ti.id,
> c.name FROM corpus_documents cd, corpus c, documents
> d, tokens_ins ti, tokens t, tokens t2, tokens_ins ti2
> WHERE c.corpusid=4 AND cd.corpusid=c.corpusid AND
> cd.docid=d.docid AND t.docid=d.docid AND ti.id=t.id
> AND ti2.id=t2.id AND t.docid=ti.docid AND
> t2.docid=ti2.docid AND t.docid=t2.docid AND
> t.word='faire' AND t2.word='présence' AND
> ti2.posi>=ti.posi-5 AND ti2.posi<=ti.posi+5;
> +----------+-------+-----------------+------+---------------+
> | posi     | docid | filename        | id   | name 
>      |
> +----------+-------+-----------------+------+---------------+
> |  2798734 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> |  4036372 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> |  4324477 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> |  5167534 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> |  5535744 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> |  6796883 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> |  7484157 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> |  9410455 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 10251037 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 11391576 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 11656957 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 12069808 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 15313652 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 15663061 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 18024245 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 18341956 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 20943027 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> | 21282138 |   366 | LeMonde2002.tag | 1110 | Le Monde
> 2002 |
> +----------+-------+-----------------+------+---------------+
> 18 rows in set (2 min 53.60 sec)
> 
> Victor, you were asking about cardinality, here's the
> output of the indexes. I'm not sure I understand what
> cardinality is about and how it would interfere: 
> 
> mysql> show index from tokens;
> +--------+------------+-------------------+--------------
> +-------------+-----------+-------------+----------+--------+------
> +------------+---------+
> | Table  | Non_unique | Key_name          |
> Seq_in_index | Column_name | Collation | Cardinality |
> Sub_part | Packed | Null | Index_type | Comment |
> +--------+------------+-------------------+--------------
> +-------------+-----------+-------------+----------+--------+------
> +------------+---------+
> | tokens |          0 | PRIMARY           | 
> 1 | word        | A         |      249541 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          0 | PRIMARY           | 
> 2 | pos         | A         |      374312 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          0 | PRIMARY           | 
> 3 | docid       | A         |      748624 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          1 | tokens_id         | 
> 1 | id          | A         |      249541 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          1 | tokens_docid      | 
> 1 | docid       | A         |         246 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          1 | tokens_word       | 
> 1 | word        | A         |      249541 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          1 | tokens_asbfreq    | 
> 1 | absfreq     | A         |        2478 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          1 | tokens_word_docid | 
> 1 | word        | A         |      249541 |     NULL |
> NULL   |      | BTREE      |         |
> | tokens |          1 | tokens_word_docid | 
> 2 | docid       | A         |      748624 |     NULL |
> NULL   |      | BTREE      |         |
> +--------+------------+-------------------+--------------
> +-------------+-----------+-------------+----------+--------+------
> +------------+---------+
> 9 rows in set (0.00 sec)
> 
> mysql> show index from tokens_ins;
> +------------+------------+------------------+--------------
> +-------------+-----------+-------------+----------+--------+------
> +------------+---------+
> | Table      | Non_unique | Key_name         |
> Seq_in_index | Column_name | Collation | Cardinality |
> Sub_part | Packed | Null | Index_type | Comment |
> +------------+------------+------------------+--------------
> +-------------+-----------+-------------+----------+--------+------
> +------------+---------+
> | tokens_ins |          0 | PRIMARY          | 
>    1 | docid       | A         |         246 | 
> NULL | NULL   |      | BTREE      |         |
> | tokens_ins |          0 | PRIMARY          | 
>    2 | posi        | A         |    24935821 | 
> NULL | NULL   |      | BTREE      |         |
> | tokens_ins |          1 | tokens_ins_id    | 
>    1 | id          | A         |      259748 | 
> NULL | NULL   |      | BTREE      |         |
> | tokens_ins |          1 | tokens_ins_posi  | 
>    1 | posi        | A         |    24935821 | 
> NULL | NULL   |      | BTREE      |         |
> | tokens_ins |          1 | tokens_ins_docid | 
>    1 | docid       | A         |         246 | 
> NULL | NULL   |      | BTREE      |         |
> +------------+------------+------------------+--------------
> +-------------+-----------+-------------+----------+--------+------
> +------------+---------+
> 5 rows in set (0.00 sec)
> 
> Any help would be more than appreciated.
> 
> 
> 
> __________________________________
> Do you Yahoo!?
> Read only the mail you want - Yahoo! Mail SpamGuard.
> http://promotions.yahoo.com/new_mail 
> 
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
> 

Reply via email to