Забавно, но почти все проблемы людей с базами данных - это скорость, а не требования к хранилищу. Это должно сказать вам кое-что: -)
У нас были подобные проблемы раньше, и я говорил это много раз: функции для каждой строки обычно плохо масштабируются. Наилучший способ их устранения - использование триггеров вставки / обновления (я предполагаю, что в MySQL они есть).
Создайте еще один столбец с вызовом pretty_city_state (или любым другим), и пусть триггеры заполняют его из города и штата при каждом добавлении или обновлении строки. Затем создайте для него индекс.
Это использует тот факт, что строки базы данных обычно читаются далеко чаще, чем они записаны (особенно в этом случае). Оценивая этот столбец при записи, вы несете стоимость между записями (тысячи), а не чтениями (вероятно, миллионы). И это письмо, когда должно переноситься просто потому, что pretty_city_state будет меняться только тогда, когда меняется город или штат. Если вы делаете конкат на каждом выборе, вы теряете усилия.
Попробуйте и измерите разницу - я уверен, что вы обнаружите, что ваши выборки будут кричать с минимальными затратами для триггеров (и эта стоимость полностью исчезнет, когда у вас будут все города и штаты в вашей базе данных.
И да, я знаю, что это нарушает 3NF. Это вполне приемлемо по соображениям производительности , если вы знаете, что делаете .
Ваш запрос может быть выполнен как:
SELECT pretty_city_state as location, AVG(latitude), AVG(longitude)
FROM places
WHERE city='New York' AND state='NY'
GROUP BY pretty_city_state
или, может быть, даже быстрее (измерить, не угадать), если вы можете объединить город и штат перед началом запроса:
SELECT pretty_city_state as location, AVG(latitude), AVG(longitude)
FROM places
WHERE pretty_city_state ='New York, NY'
GROUP BY pretty_city_state