У меня есть вызов базы данных, который я не уверен, что я делаю это наиболее эффективным способом. В основном вызов запрашивает таблицу событий с zip-кодами, а затем объединяет базу данных почтового индекса, которая дает lat/lon этого события zip. Затем он присоединяется к зарегистрированному пользователю к запросу, и у пользователя есть лог /lon при входе в систему. Таким образом, весь запрос вытягивает события изнутри так много миль пользователей lat/lon.
Мой вопрос, есть ли лучший способ сделать это, вызывая этот запрос каждый раз, когда страница загружается? будет ли хранимая процедура работать быстрее? У меня нет опыта с ними. Я использую MySQL.
$this->db->select('*');
$this->db->from('events');
$this->db->join('zipcodes', 'zipcodes.zipcode = courses.courseZip');
$this->db->join('eventTypes', 'eventTypes.eventTypeID = events.eventType');
$this->db->where('eventApproved', 1);
$this->db->select('(DEGREES(ACOS(SIN(RADIANS('.$this->user['userLat'].'))
* SIN(RADIANS(latitude))
+ COS(RADIANS('.$this->user['userLat'].'))
* COS(RADIANS(latitude))
* COS(RADIANS('.$this->user['userLon'].' - longitude))))) * 69.09 AS distance');
$this->db->having('distance <', 100);
Да, это поможет иметь хранимую процедуру здесь. Причины 1. он делает ваш уровень базы данных более управляемым 2. SP предварительно скомпилированы. Когда вы запустите их сначала, двигатель создаст план выполнения и сохранит план. В следующий раз, когда он запустится, он повторно использует план. Таким образом, вы получаете высокую производительность. В вашем случае вы можете получить много преимуществ, если подчеркнутая таблица не будет меняться (обновляться/удаляться) слишком сильно после создания SP. Если это так, вы можете РЕКОМПИЛИРОВАТЬ sp (Запуск с REOMPILE OPTION), и он создаст и сохранит новый план.
Как вы это делаете. Ну, это довольно легко. Если вы используете HeidiSQL для MySQL Front End или браузер запросов MYSQL Enterprise 5.0, вы можете сгенерировать SP графически. Но даже если вы хотите закодировать его с нуля, это легко.
http://dev.mysql.com/doc/refman/5.0/en/stored-routines-syntax.html
Sp также рекомендуется с точки зрения безопасности, поскольку они могут остановить атаки SQL Injection.
Как только у вас есть SP, вы можете настроить таблицу, чтобы ускорить работу SP. 1. Создайте индекс (некластеризованный) в столбцах в разделе where 2. Включите столбец, который вы ввели в SELECT в этом индексе.
В Microsoft SQL Server вы можете использовать этот индекс заполнения. Я не уверен, что вы можете сделать это в MYSQL или нет. Но даже если вы можете попытаться создать индекс, охватывающий столько столбцов, сколько сможете, в кластерном или некластеризованном индексе.
НТН
Ваше желание хранить как можно больше данных (например, пользователя lat/long) в Session. Таким образом, вы не запрашиваете эти данные, которые не меняются, при каждой загрузке страницы.
lat
/long
из базы данных и разработать для этого функцию php.