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

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

0 голосов
/ 15 сентября 2010

У меня есть вызов из базы данных, и я не уверен, что делаю это наиболее эффективно. По сути, запрос запрашивает таблицу событий с почтовыми индексами, а затем присоединяется к базе данных почтовых индексов, которая дает широту и длительность этих событий. Затем он присоединяет вошедшего в систему пользователя к запросу, и этот пользователь имеет лат / долг после входа в систему. Таким образом, весь запрос извлекает события из стольких миль от пользователей широты / долготы.

Мой вопрос, есть ли лучший способ сделать это, затем вызывать этот запрос при каждой загрузке страницы? хранимая процедура будет быстрее? У меня нет никакого опыта с ними. Я использую 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);

Ответы [ 2 ]

0 голосов
/ 15 сентября 2010

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

0 голосов
/ 15 сентября 2010

Да, это поможет иметь хранимую процедуру здесь.Причины 1. это делает ваш слой базы данных более управляемым 2. SP предварительно скомпилированы.Когда вы запускаете их сначала, движок создаст план выполнения и сохранит план.В следующий раз, когда он запустится, он повторно использует план.Таким образом, вы получаете некоторую выгоду производительности.В вашем случае вы можете получить большую выгоду, если подчеркнутая таблица не изменяется (обновляется / удаляется) после создания SP.Если это так, то вы можете РЕКОМПИЛИРОВАТЬ sp (запустить его с опцией RECOMPILE), и он создаст и сохранит новый план.

Как вы это делаете.Ну, это довольно просто.Если вы используете HeidiSQL для MySQL Front End или браузер запросов MYSQL enterprise 5.0, вы можете сгенерировать SP графически.Но даже если вы хотите закодировать его с нуля, это легко.

http://dev.mysql.com/doc/refman/5.0/en/stored-routines-syntax.html

Sp также рекомендуется с точки зрения безопасности, поскольку они могут остановить атаки SQL-инъекций.

Когда у вас есть SP, вы можете настроить стол, чтобы сделать SP быстрее.1. Создайте индекс (некластеризованный) для столбцов в предложении where 2. Включите столбец, который вы вносите в этот индекс, в SELECT.

В Microsoft SQL Server вы можете сделать это, используя индекс покрытия.Я не уверен, можете ли вы сделать это в MYSQL или нет.Но даже если вы можете, вы должны попытаться создать индекс, охватывающий как можно больше столбцов в кластеризованном или некластеризованном индексе.

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...