2009/10/23 Aryeh Gregor <simetrical+wikil...@gmail.com>:
> On Fri, Oct 23, 2009 at 12:20 PM, Andrew Dunbar <hippytr...@gmail.com> wrote:
>> Yes I didn't specify tl_namespace
>
> In MySQL that will usually make it impossible to effectively use an
> index on (tl_namespace, tl_title), so it's essential that you specify
> the NS.  (Which you should anyway to avoid hitting things like
> [[Template talk:Infobox language]].)  Some DBMSes (including sometimes
> MySQL >= 5.0, although apparently not here) are smart enough to use
> this kind of index pretty well even if you don't specify the
> namespace, but it would still be somewhat more efficient to specify it
> -- the DB would have to do O(1/n) times as many index lookups, where n
> is the number of namespaces.
>
>> and when I check for which columns
>> have keys I could see none:
>> mysql> describe templatelinks;
>> +--------------+-----------------+------+-----+---------+-------+
>> | Field        | Type            | Null | Key | Default | Extra |
>> +--------------+-----------------+------+-----+---------+-------+
>> | tl_from      | int(8) unsigned | NO   |     | 0       |       |
>> | tl_namespace | int(11)         | NO   |     | 0       |       |
>> | tl_title     | varchar(255)    | NO   |     |         |       |
>> +--------------+-----------------+------+-----+---------+-------+
>> 3 rows in set (0.01 sec)
>
> The toolserver database uses views.  In MySQL, views can't have
> indexes themselves, but your query is rewritten to run against the
> real table -- which you can't access directly, but which does have
> indexes.  EXPLAIN is your best bet here:
>
> mysql> EXPLAIN SELECT tl_from FROM templatelinks WHERE tl_title IN
> ('Infobox_Language', 'Infobox_language');
> +----+-------------+---------------+-------+---------------+---------+---------+------+-----------+--------------------------+
> | id | select_type | table         | type  | possible_keys | key     |
> key_len | ref  | rows      | Extra                    |
> +----+-------------+---------------+-------+---------------+---------+---------+------+-----------+--------------------------+
> |  1 | SIMPLE      | templatelinks | index | NULL          | tl_from |
> 265     | NULL | 149740990 | Using where; Using index |
> +----+-------------+---------------+-------+---------------+---------+---------+------+-----------+--------------------------+
> 1 row in set (0.00 sec)
>
> mysql> EXPLAIN SELECT tl_from FROM templatelinks WHERE tl_namespace=10
> AND tl_title IN ('Infobox_Language', 'Infobox_language');
> +----+-------------+---------------+-------+---------------+--------------+---------+------+------+--------------------------+
> | id | select_type | table         | type  | possible_keys | key
>   | key_len | ref  | rows | Extra                    |
> +----+-------------+---------------+-------+---------------+--------------+---------+------+------+--------------------------+
> |  1 | SIMPLE      | templatelinks | range | tl_namespace  |
> tl_namespace | 261     | NULL | 6949 | Using where; Using index |
> +----+-------------+---------------+-------+---------------+--------------+---------+------+------+--------------------------+
> 1 row in set (0.00 sec)
>
> Note the number of rows scanned in each case.  Your query was scanning
> all of templatelinks, the other is retrieving the exact rows needed
> and not looking at any others ("type" = "index" vs. "range").  The
> reason for this is given in the "possible_keys" column: MySQL can find
> no keys that are usable for lookup, if you omit tl_namespace.

Thanks for the very informative reply. I already knew most of this
stuff passively except database/SQL views. Now I've just got to put it
into more practice.

Andrew Dunbar (hippietrail)

> _______________________________________________
> Wikitech-l mailing list
> Wikitech-l@lists.wikimedia.org
> https://lists.wikimedia.org/mailman/listinfo/wikitech-l



-- 
http://wiktionarydev.leuksman.com http://linguaphile.sf.net

_______________________________________________
Wikitech-l mailing list
Wikitech-l@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/wikitech-l

Reply via email to