Quoting Marnen Laibow-Koser <li...@ruby-forum.com>:
> Jeffrey L. Taylor wrote in post #958953:
> > How should I index the terms table for maximum speed?
> 
> How can we tell you?  You neglected to say how you're using that 
> table...or is the query below the only one you're interested in?
> 

Correct, this is the one I care about.  All others are trivial in terms of
resources compared to this one.

> >  It doesn't have
> > to be
> > Rails migration doable.
> 
> But it will be, since adding indices generally is.
> 

Composite keys are not supported in stock Rails.  And I will not switch DB
servers next week, so having the index creation in portable form is not a 
necessity.

> >  E.g. a primary key of (user_id, article_id,
> > fnv) is
> > okay.  fnv is a 63 bit Fowler-Noll-Vo hash.
> >
> >
> >   def self.neighbors(user_id, article_id)
> >     sql = "SELECT t1.article_id, SUM(t1.freq * t2.freq) AS cosim FROM "
> > \
> >     "tokens AS t1 JOIN tokens AS t2 " \
> >     "ON t1.fnv = t2.fnv WHERE t1.user_id = #{user_id} AND t2.user_id =
> > #{user_id} AND " \
> >     "t1.scoring = 1 AND t2.scoring = 0 AND t2.article_id = #{article_id}
> > GROUP BY t1.article_id " \
> >     "ORDER BY cosim DESC LIMIT 3"
> >     connection.select_rows(sql)
> >   end
> 
> Run EXPLAIN SELECT on this query (or whatever your DB's equivalent is). 
> See where it's doing full table scans and add indices as appropriate.
> 
> 
mysql> explain extended SELECT t1.article_id, SUM(t1.freq * t2.freq) FROM 
tokens AS t1 JOIN tokens AS t2 ON t1.token = t2.token AND t1.user_id = 1 AND 
t2.user_id = 1 AND t1.scoring = 1 AND t2.scoring = 0 GROUP BY article_id;
+----+-------------+-------+------+---------------+------+---------+------+-------+----------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | 
rows  | filtered | Extra                                        |
+----+-------------+-------+------+---------------+------+---------+------+-------+----------+----------------------------------------------+
|  1 | SIMPLE      | t1    | ALL  | user_id       | NULL | NULL    | NULL | 
34773 |   100.00 | Using where; Using temporary; Using filesort |
|  1 | SIMPLE      | t2    | ALL  | user_id       | NULL | NULL    | NULL | 
34773 |   100.00 | Using where; Using join buffer               |
+----+-------------+-------+------+---------------+------+---------+------+-------+----------+----------------------------------------------+
2 rows in set, 1 warning (0.07 sec)

mysql> show warnings;
| Level | Code | Message

| Note  | 1003 | select `tv2sql_development`.`t1`.`article_id` AS 
`article_id`,sum((`tv2sql_development`.`t1`.`freq` * 
`tv2sql_development`.`t2`.`freq`)) AS `SUM(t1.freq * t2.freq)` from 
`tv2sql_development`.`tokens` `t1` join `tv2sql_development`.`tokens` `t2` 
where ((`tv2sql_development`.`t2`.`scoring` = 0) and 
(`tv2sql_development`.`t1`.`scoring` = 1) and 
(`tv2sql_development`.`t2`.`user_id` = 1) and 
(`tv2sql_development`.`t1`.`user_id` = 1) and 
(`tv2sql_development`.`t2`.`token` = `tv2sql_development`.`t1`.`token`)) group 
by `tv2sql_development`.`t1`.`article_id` |


TIA,
  Jeffrey

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-t...@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to