On Wednesday 25 of February 2015, Arkadiusz Miśkiewicz wrote:

> mysql> EXPLAIN SELECT COUNT(DISTINCT main.id) FROM Tickets main JOIN 
> Transactions Transactions_1  ON ( Transactions_1.ObjectType = 'RT::Ticket' ) 
> AND ( Transactions_1.ObjectId = main.id ) LEFT JOIN Attachments 
> Attachments_2  ON ( Attachments_2.TransactionId = Transactions_1.id ) LEFT 
> JOIN AttachmentsIndex AttachmentsIndex_3  ON ( AttachmentsIndex_3.id = 
> Attachments_2.id )  WHERE (main.IsMerged IS NULL) AND (main.Status != 
> 'deleted') AND (main.Type = 'ticket') AND ( (  ( main.Subject LIKE 
> '%inconventus%' OR  ( AttachmentsIndex_3.query = 'inconventus' )  )  )  AND  
> ( main.Status = 'new' OR main.Status = 'open' OR main.Status = 'stalled' ) );
> +----+-------------+--------------------+-------+------------------------+----------------+---------+-----------------------+------+----------------------------------------------------+
> | id | select_type | table              | type  | possible_keys          | 
> key            | key_len | ref                   | rows | Extra               
>                                |
> +----+-------------+--------------------+-------+------------------------+----------------+---------+-----------------------+------+----------------------------------------------------+
> |  1 | SIMPLE      | main               | range | PRIMARY,tickets_status | 
> tickets_status | 195     | NULL                  | 2228 | Using index 
> condition; Using where                 |
> |  1 | SIMPLE      | Transactions_1     | ref   | Transactions1          | 
> Transactions1  | 70      | const,rt3.main.id     |    1 | Using where; Using 
> index                           |
> |  1 | SIMPLE      | Attachments_2      | ref   | Attachments2           | 
> Attachments2   | 4       | rt3.Transactions_1.id |    4 | Using index         
>                                |
> |  1 | SIMPLE      | AttachmentsIndex_3 | ALL   | NULL                   | 
> NULL           | NULL    | NULL                  |   20 | Using where; Using 
> join buffer (Block Nested Loop) |
> +----+-------------+--------------------+-------+------------------------+----------------+---------+-----------------------+------+----------------------------------------------------+
> 4 rows in set (0.00 sec)

Ok, mysql is too smart! For sphinx to work mysql needs to first query
AttachmentsIndex_3 and then make joins to it. Otherwise sphinx won't work.
That's due to sphinx architecture.

Here mysql is too smart and differently optimizes query thus breaking
sphinx support in rt.

Now I've tried FORCE INDEX and such but wasn't able to force mysql to first 
query
AttachmentsIndex_3.

There is STRAIGHT_JOIN that forces joins orders, so maybe that is some solution.

Other ideas?
-- 
Arkadiusz Miśkiewicz, arekm / ( maven.pl | pld-linux.org )

Reply via email to