Tag: MySQL

PHP / MySQL中的地理search(距离)(性能)

我有一个MySQL表(MyISAM),其中包含大约200k条经纬度/长对,根据来自另一个纬度/长度对的距离(大圆公式)select。 (例如,在50.281852,2.504883附近的10km范围内的所有条目) 我的问题是,这个查询大约需要0.28秒。 只为那些200k条目运行(每天继续获得更多)。 虽然0,28秒 通常会很好,这个查询运行的频率非常高,因为它支持我的web应用程序的主要function,而且通常是更大查询的一部分。 有什么办法可以加速吗? 显然,MySQL必须每次运行所有200k条目,并为每个条目执行大圆公式。 我在这里阅读了一些关于geohashing,R-Trees之类的东西,但是我不认为这是我想要去的方式。 部分原因是我从来没有成为一个math迷,但主要是因为我认为这个问题已经被图书馆/扩展等比我聪明的人解决了。 已经过广泛的testing,并且正在定期更新。 MySQL似乎有一个空间扩展,但没有提供一个距离函数。 我应该看另一个数据库来把这个坐标对? PostgreSQL似乎有一个相当成熟的空间扩展。 你知道吗? 或者,PostgreSQL也只是简单地使用大圆圈公式来获取特定区域内的所有条目? 有可能是一个专门的独立产品或MySQL的扩展已经做了我在找什么? 或者可能有一个PHP库,我可以用来做计算? 使用APC,我可以很容易地把经纬度对放入内存(这些200k条目大约需要5MB),然后在PHP中运行查询。 然而,这种方法的问题是,那么我会有一个MySQL查询像SELECT .. FROM .. WHERE id(id1,id2,..)所有的结果至多可以达到几千。 MySQL如何处理这些查询? 然后(因为这是一个数字处理任务)会这样做在PHP中足够快? 任何其他的想法我应该/不应该做什么? 完整版,这里是示例查询,剥离了任何不相关的部分(正如我所说,通常这是一个更大的查询,我join了多个表的一部分): SELECT id, 6371 * acos( sin( radians( 52.4042924 ) ) * sin( radians( lat ) ) + cos( radians( 50.281852 ) ) * cos( radians( lat […]

PHP + PDO + MySQL:如何从MySQL中返回整数和数字列作为整数和数字在PHP中?

我已经看到这个问题在Stack Overflow上重复了几次,但是没有一个能够充分地探究这个问题(或者至less对我有帮助) 问题是数据库查询应该返回整型数据types的整数列在PHP中。 而是查询以stringtypes的forms返回每一列。 我已经确保“PDO :: ATTR_STRINGIFY_FETCHES”如果只是为了确保结果不被转换为string。 我见过的答案: 这是不能做到的 不,它正在Mac OS X上安装PHP / MySQL 在你的代码中input所有的值 不,我不会这样做的 不要担心,PHP是松散的types 我的数据以JSONforms输出,并被许多其他服务使用,有些则需要格式正确的数据 从我的研究中,我了解到这是一个驱动程序的实现问题。 许多消息来源声称,MySQL本地驱动程序不支持返回的数字types。 这似乎不正确,因为它在Mac OS X上工作。除非他们的意思是说“ Linux上的MySQL本地驱动程序不支持该function”。 这意味着我在Mac OS X上安装的驱动程序/环境有一些特殊之处。我一直试图找出差异来应用修复程序,但是由于我对如何检查这些东西的知识而受到限制。 区别: OS X上的PHP是通过Home Brew编译和安装的 Ubuntu上的PHP通过“apt-get install php5-dev”安装 OS X上的PHP连接到也在OS X上运行的MySQL服务器 服务器版本:5.1.71-日志源分配 Ubuntu上的PHP连接到Rackspace云数据库 服务器版本:5.1.66-0 + squeeze1(Debian) Ubuntu环境 版本:10.04.1 PHP 5.4.21-1 + debphp.org〜lucid + 1(cli)(内置:2013年10月21日08:14:37) php -i PDO_MYSQL 用于MySQL的PDO驱动程序=>启用的客户端API版本=> 5.1.72 […]

PDO mysql:如何知道插入是否成功

我正在使用PDO插入一个logging(MySQL和PHP) $stmt->bindParam(':field1', $field1, PDO::PARAM_STR); $stmt->bindParam(':field2', $field2, PDO::PARAM_STR); $stmt->execute(); 有没有办法知道它是否插入成功,例如,如果logging没有插入,因为它是重复的? 编辑:当然,我可以看看数据库,但我的意思是程序化的反馈。

SQL顺序string作为数字

我将数字保存为VARCHAR到MySQL数据库。 由于其他情况,我不能让他们成为INT 。 在sorting的时候把它们当作字符而不是数字。 在数据库中我有 1 2 3 4 5 6 7 8 9 10… 在我的页面上,它显示了这样的有序列表: 1 10 2 3 4 5 6 7 8 9 我怎样才能让它看起来按数字升序排列?

MySQL表中varchar长度的重要性

我有一个dynamic插入行的MySQL表。 因为我不能确定string的长度,也不希望它们被截断,所以我把它们变成了比我需要的大一些的varchar(200)。 给varchar字段的长度比所需要的要长得多吗?

我使用JDBC连接池吗?

我想确定我是否实际使用JDBC连接池。 经过一番研究,实现起来似乎太简单了。 实际上比常规连接更容易,所以我想validation一下。 这是我的连接类: public class DatabaseConnection { Connection conn = null; public Connection getConnection() { BasicDataSource bds = new BasicDataSource(); bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUrl("jdbc:mysql://localhost:3306/data"); bds.setUsername("USERNAME"); bds.setPassword("PASSWORD"); try{ System.out.println("Attempting Database Connection"); conn = bds.getConnection(); System.out.println("Connected Successfully"); }catch(SQLException e){ System.out.println("Caught SQL Exception: " + e); } return conn; } public void closeConnection() throws SQLException { conn.close(); } } […]

错误2003(HY000):无法连接到“127.0.0.1”(111)上的MySQL服务器

我使用以下命令: mysql -u root -h 127.0.0.1 -p 并且错误信息是: ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111) 谁可以帮我解决这个问题?

错误:错误1005:无法创build表(errno:121)

我正在麻烦forward engineering我的MySQL数据库到WAMP服务器..我打算张贴模式的形象,但因为这是我的第一篇文章,我不能.. 下面是执行的脚本 use aquaticstar; SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; — —————————————————– — Table `Students` — —————————————————– DROP TABLE IF EXISTS `Students` ; CREATE TABLE IF NOT EXISTS `Students` ( `id` VARCHAR(10) NOT NULL , `studentName` VARCHAR(45) NOT NULL , `gender` CHAR NOT NULL , `birthDate` DATETIME NOT NULL , `mNo` […]

imploding在python MySQLDB IN子句中使用的列表

我知道如何将一个列表映射到一个string: foostring = ",".join( map(str, list_of_ids) ) 而且我知道我可以使用以下命令将该string转换为IN子句: cursor.execute("DELETE FROM foo.bar WHERE baz IN ('%s')" % (foostring)) 我需要的是用MySQLDB安全地完成同样的事情(避免SQL注入)。 在上面的例子中,因为foostring没有被作为parameter passing来执行,所以它很脆弱。 我也必须引用和逃避外部的MySQL库。 (这里有一个相关的SO问题 ,但是那里列出的答案要么不适用于MySQLDB,要么很容易被SQL注入。

MySQL服务器已经消失 – 正好60秒

我最近发现一个早期运行良好的sql查询现在在60秒后超时并抛出一个错误。 查询很慢,但作为夜间工作的一部分,所以这本身不是一个问题(所以请不要build议我优化它)。 我可以通过运行“select SLEEP(120)”来一致地重现错误; 来自PHP,如下所示。 但是,从MySQL客户端运行相同的语句是成功的(返回0)。 我试过调整wait_timeout(设置为28800),但没有运气。 我也重新启动了数据库服务器和机器本身。 事实上,它总是在60秒时间内超时,这一事实表明,这可能是一个环境,而不是一个有限的资源问题。 我在跑: Windows Server 2003 MySql 5.1.36社区 PHP 5.3 以下是我的testing代码,输出以及SHOW VARIABLES的结果 谢谢! 码: set_error_handler("sqlErrorHandler"); set_time_limit(12000); $link = mysql_connect("$MYSQL_Host","$MYSQL_User","$MYSQL_Pass"); mysql_select_db($MYSQL_db, $link); echo "mysql_ping = " . (mysql_ping($link) ? "LIVE" : "DEAD") . "<br /><br />"; $sql = "SELECT SLEEP(120);"; $start = microtime(true); mysql_query($sql, $link); echo "**query done**<br />"; […]