J'utilise 'explain' pour voir pourquoi ma requête touche toutes les lignes de ma base de données, et je ne comprends pas pourquoi c'est le cas.Mysql n'utilise pas mes index
Quelqu'un pourrait jeter un coup d'oeil et me donner un indice de ce qui me manque?
Ma base de données est MyISAM, et je me sers Mysql 5.1, PHP5
Voici ma table:
--
-- Table structure for table `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`user_id` bigint(20) NOT NULL auto_increment,
`name` varchar(40) default NULL,
`city` varchar(90) default NULL,
`latitude` float NOT NULL default '0',
`longitude` float NOT NULL default '0',
PRIMARY KEY (`user_id`),
UNIQUE KEY `name` (`name`),
KEY `Radius Search` (`latitude`,`longitude`),
KEY `Radius 2` (`longitude`,`latitude`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=38666 ;
Voici ma question:
$query =
"SELECT
name, city
FROM
users
WHERE
(
(69.1 * (latitude - " . $user->latitude . ")) *
(69.1 * (latitude - " . $user->latitude . "))
) + (
(69.1 * (longitude - " . $user->longitude . ") * COS(" . $user->latitude . "/57.3)) *
(69.1 * (longitude - " . $user->longitude . ") * COS(" . $user->latitude . "/57.3))
) < " . pow($radius, 2) . "
ORDER BY
(
(69.1 * (latitude - " . $user->latitude . ")) *
(69.1 * (latitude - " . $user->latitude . "))
) + (
(69.1 * (longitude - " . $user->longitude . ") * COS(" . $user->latitude . "/57.3)) *
(69.1 * (longitude - " . $user->longitude . ") * COS(" . $user->latitude . "/57.3))
) ASC";
Et enfin, mon expliquer ...
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE users ALL NULL NULL NULL NULL 38665 Using where; Using filesort
$ Vous pouvez garder le rayon circulaire et juste * ajouter * entre les clauses; alors l'indexation devrait commencer, mais les choses en dehors du cercle seront toujours exclues par l'endroit où. – ysth
Il y a un bon exemple de ceci à http://www.goondocks.com/blog/08-01-22/zip_code_radius_search_using_mysql.aspx – ysth