хранимая процедура mysql

0

У меня есть вызов базы данных, который я не уверен, что я делаю это наиболее эффективным способом. В основном вызов запрашивает таблицу событий с 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);
  • 0
    не будет ли быстрее выбрать lat / long из базы данных и разработать для этого функцию php.
  • 0
    что вы имеете в виду? широта / долгота поступает из базы данных для событий с присоединением к таблице почтовых индексов, сопоставляющей почтовый индекс события с почтовым индексом в таблице почтовых индексов. пользовательский объект предоставляет свой широту / долготу.
Теги:
codeigniter

2 ответа

0
Лучший ответ

Да, это поможет иметь хранимую процедуру здесь. Причины 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 или нет. Но даже если вы можете попытаться создать индекс, охватывающий столько столбцов, сколько сможете, в кластерном или некластеризованном индексе.

НТН

  • 1
    Спасибо, это хороший совет, я научусь делать SP. С другой стороны, я также заставил каждое событие содержать свои собственные значения широты и долготы, поэтому мне теперь вообще не нужно присоединяться к базе данных zipcode в запросе.
  • 0
    Отлично . Это снова получило бы прирост производительности
0

Ваше желание хранить как можно больше данных (например, пользователя lat/long) в Session. Таким образом, вы не запрашиваете эти данные, которые не меняются, при каждой загрузке страницы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню