Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 存储过程mysql_Php_Mysql_Codeigniter - Fatal编程技术网

Php 存储过程mysql

Php 存储过程mysql,php,mysql,codeigniter,Php,Mysql,Codeigniter,我有一个数据库调用,我不确定我是否以最有效的方式进行。基本上,该调用使用邮政编码查询一个事件表,然后加入一个邮政编码数据库,该数据库提供该邮政编码事件的lat/lon。然后,它将登录用户加入查询,并且该用户在登录时具有lat/lon。所以整个查询从用户lat/lon的许多英里范围内提取事件 我的问题是,有没有更好的方法在每次加载页面时调用此查询?存储过程会更快吗?我对他们没有任何经验。我正在使用MySQL $this->db->select('*'); $this->d

我有一个数据库调用,我不确定我是否以最有效的方式进行。基本上,该调用使用邮政编码查询一个事件表,然后加入一个邮政编码数据库,该数据库提供该邮政编码事件的lat/lon。然后,它将登录用户加入查询,并且该用户在登录时具有lat/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);
$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('(度数(ACOS(SIN(弧度('.$this->user['userLat']))
*SIN(弧度(纬度))
+COS(弧度('.$this->user['userLat'].'))
*COS(弧度(纬度))
*COS(弧度('.$this->user['userLon'].-经度()()))*69.09作为距离);

$this->db->having('distanceYes)在这里有一个存储过程会有所帮助。 原因是 1.它使您的数据库层更易于管理 2.SP是预编译的。当您首先运行它们时,引擎将创建一个执行计划并保存该计划。下次运行时,它将重用该计划。因此您会获得一些性能好处。在您的情况下,如果下划线的表没有更改(更新/删除),您可能会获得很多好处创建SP后的时间过多。如果是,则可以重新编译SP(使用“重新编译”选项运行SP),SP将创建并保存新计划

你是怎么做到的。 这很简单。如果您使用HeidiSQL for MySQL前端或MySQL enterprise 5.0的查询浏览器,您可能能够以图形方式生成SP。但即使您想从头开始编写SP,也很容易

从安全角度来看,Sp也是可取的,因为它们可以阻止SQL注入攻击

拥有SP后,您可以调整表以加快SP的速度。 1.在where子句中的列上创建索引(非聚集) 2.在此索引中包括您引入SELECT的列

在Microsoft SQL Server中,您可以使用覆盖索引进行此操作。我不确定您是否可以在MYSQL中进行此操作。但即使可以,您也应该尝试在聚集索引或非聚集索引中创建一个覆盖尽可能多的列的索引


HTH

您希望存储尽可能多的数据(例如用户的lat/long)以尽可能快的方式。这样,您就不会在每次页面加载时查询此数据,这并不是真的在改变。

从数据库中选择
lat
/
long
并开发一个php函数来执行此操作会不会更快。您的意思是什么?lat/lon确实来自具有zipcodes表连接的事件数据库将事件的zipcode与zipcode表中的zipcode进行匹配。用户对象提供了自己的lat/lon。谢谢,这是一个好建议,我将学习如何执行SP。另外,我还使每个事件都具有自己的lat/lon,因此我现在根本不需要在查询中加入zipcode数据库。