Hi
I have reached the optimisation stage of my project.
I am trying to work out how to reduce the turnaround time for my queries.
I implemented 'db_index=True'  for the fields where i determined there
should be a performance boost by indexing that particular field.
This has not really improved the speed of the queries.

Worst case senario is that my website will have to display about 500
out of 6000 entries in the db.

Each entry bridges a many-to-many relationship with another table and
also follows a reverse one-to-one which will return a set of related
entries. Often the query takes 12-14 seconds from start to finish.
(and 4-5 seconds to display around 100 results)
The major performance penalty thus far has been measured to be when
the MySQL statements for these queries are executed.
The many-to-may and one-to-many components only return 1-3 related
records at most for each entry and they always hit indexes so that
part of the design is optimised.

I have been using the following tools:

print connection.queries
import time
and looking at the raw MySQL to see whatother optmisations could be made.
use of MySQL EXPLAIN

Anyway, here are the details:

*in views.py the method that packages the results from the mysql query:
http://pastebin.com/m3eef56e5

*the models associated with this from two applications: 'directory' and 'common'
http://pastebin.com/m3868a1fc
http://pastebin.com/m18ec3765

*python manage.py sqlall directory && python manage.py sqlall common:

http://pastebin.com/m63a50593
http://pastebin.com/m6f958cda

As far as I can tell indexes are working and the queries should be fast.

Here is the MySQL per iteration (will execute 500 times for my worst
case scenario which takes 12 seconds on average)

SELECT `common_addresstype`.`id`, `common_addresstype`.`adrtype` FROM
`common_addresstype` WHERE `common_addresstype`.`id` = 1;
SELECT `common_addresstype`.`id`, `common_addresstype`.`adrtype` FROM
`common_addresstype` WHERE `common_addresstype`.`id` = 2;
SELECT `common_addradmin`.`id`,
`common_addradmin`.`surfaceMail_works`,
`common_addradmin`.`addr_enabled` FROM `common_addradmin` WHERE
`common_addradmin`.`id` = 1;
SELECT `common_address`.`id`, `common_address`.`airfield_id`,
`common_address`.`country_id`, `common_address`.`addresstype_id`,
`common_address`.`addradmin_id`, `common_address`.`location_id`,
`common_address`.`street1`, `common_address`.`street2`,
`common_address`.`user_lat_dec`, `common_address`.`user_long_dec`,
`common_address`.`zoom` FROM `common_address` INNER JOIN
`common_address_directory` ON (`common_address`.`id` =
`common_address_directory`.`address_id`) WHERE
`common_address_directory`.`directory_id` = 4267;

Last but not least Explain for the above MySQL for 1 instance of 500 entries.

mysql> EXPLAIN SELECT `common_addresstype`.`id`,
`common_addresstype`.`adrtype` FROM `common_addresstype` WHERE
`common_addresstype`.`id` = 1;
+----+-------------+--------------------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table              | type  | possible_keys | key
   | key_len | ref   | rows | Extra |
+----+-------------+--------------------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | common_addresstype | const | PRIMARY       |
PRIMARY | 4       | const |    1 |       |
+----+-------------+--------------------+-------+---------------+---------+---------+-------+------+-------+

mysql> EXPLAIN SELECT `common_addresstype`.`id`,
`common_addresstype`.`adrtype` FROM `common_addresstype` WHERE
`common_addresstype`.`id` = 2;
+----+-------------+--------------------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table              | type  | possible_keys | key
   | key_len | ref   | rows | Extra |
+----+-------------+--------------------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | common_addresstype | const | PRIMARY       |
PRIMARY | 4       | const |    1 |       |
+----+-------------+--------------------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT `common_addradmin`.`id`,
`common_addradmin`.`surfaceMail_works`,
`common_addradmin`.`addr_enabled` FROM `common_addradmin` WHERE
`common_addradmin`.`id` = 1;
+----+-------------+------------------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table            | type  | possible_keys | key
 | key_len | ref   | rows | Extra |
+----+-------------+------------------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | common_addradmin | const | PRIMARY       |
PRIMARY | 4       | const |    1 |       |
+----+-------------+------------------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)


mysql> EXPLAIN SELECT `common_address`.`id`,
`common_address`.`airfield_id`, `common_address`.`country_id`,
`common_address`.`addresstype_id`, `common_address`.`addradmin_id`,
`common_address`.`location_id`, `common_address`.`street1`,
`common_address`.`street2`, `common_address`.`user_lat_dec`,
`common_address`.`user_long_dec`, `common_address`.`zoom` FROM
`common_address` INNER JOIN `common_address_directory` ON
(`common_address`.`id` = `common_address_directory`.`address_id`)
WHERE `common_address_directory`.`directory_id` = 4267;
+----+-------------+--------------------------+--------+--------------------------------------------------+---------------------------------------+---------+----------------------------------------------------+------+-------+
| id | select_type | table                    | type   | possible_keys
                                   | key
    | key_len | ref                                                |
rows | Extra |
+----+-------------+--------------------------+--------+--------------------------------------------------+---------------------------------------+---------+----------------------------------------------------+------+-------+
|  1 | SIMPLE      | common_address_directory | ref    |
address_id,directory_id_refs_id_4b74d39abef4d575 |
directory_id_refs_id_4b74d39abef4d575 | 4       | const
                              |    1 |       |
|  1 | SIMPLE      | common_address           | eq_ref | PRIMARY
                                   | PRIMARY
    | 4       | aeroclub_devel.common_address_directory.address_id |
 1 |       |
+----+-------------+--------------------------+--------+--------------------------------------------------+---------------------------------------+---------+----------------------------------------------------+------+-------+
2 rows in set (0.00 sec)

What I dont want to do is use caching id rather solve this first. I
also dont want to refactor the db into less tables, it is designed
near perfect so far as db Object Oriented design principles and
requirements for the project.


cheers
-Sam

--

You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.


Reply via email to