繁体   English   中英

存储过程mysql

[英]stored procedure mysql

我有一个数据库调用,我不确定我是否以最有效的方式进行。 基本上,该调用会查询带有邮政编码的事件表,然后加入一个提供该事件邮政编码的经纬度的邮政编码数据库。 然后,它将已登录的用户加入到查询中,并且该用户在登录时具有纬度/经度。因此,整个查询从纬度/经度的用户数英里之内提取事件。

我的问题是,有什么更好的方法可以在每次加载页面时调用此查询吗? 存储过程会更快吗? 我对他们没有任何经验。 我正在使用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(使用RECOMPILE OPTION运行它),它将创建并保存一个新计划。

你怎么做的。 好吧,这很容易。 如果将HeidiSQL用于MySQL前端或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中完成。 但是,即使可以,您也应该尝试创建一个索引,该索引在聚簇索引或非聚簇索引中都可以覆盖尽可能多的列。

高温超导

您将要在Session中存储尽可能多的数据(例如用户的经/纬度)。 这样,您在每次页面加载时都不会查询此数据,这并没有真正改变。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM