繁体   English   中英

PHP/MySQL - 查询(仅选择)48k 行的性能注意事项

[英]PHP/MySQL - Performance considerations querying (select only) 48k rows

我目前正在尝试构建一个 web 应用程序,该应用程序非常依赖邮政编码数据(由OS CodePoint Open提供)。 邮政编码数据库有 120 个表格,这些表格分解了初始邮政编码前缀(即 SE、WS、B)。 在这些表中,有 11k - 48k 行,包含 3 个字段(Postcode、Lat、Lng)。

我需要做的是让用户上网,输入他们的邮政编码,即 SE1 1LD,然后选择 SE 表,并将邮政编码转换为 lat / lng。

我可以在 PHP 级别上执行此操作。 我担心的是......好吧,将查询的大量行以及它是否会使我的网站停止运行?

如果有任何我应该知道的技术,请告诉我.. 我从来没有使用过大数字的表格!

谢谢:)

48K 不是大数字。 4800万是。 :) 如果您的表被正确索引(将索引放在您在WHERE子句中使用的字段上),那根本不是问题。

避免LIKE ,并尽可能使用 INNER JOINS 而不是 LEFT JOIN。

从 mysql 的 48k 行中选择并不大,实际上它相当小。 正确索引它,你很好。

如果我理解正确,有一个SE表、一个WS表、一个B表等。总共有 120 个具有相同结构的表(Postcode, Lat, Lng)

我强烈建议您对表格进行规范化

您可以拥有一张桌子:

postcode( prefix, postcode, lat, lng)

或两个:

postcode( prefixid , postcode, lat, lng )

prefix( prefixid, prefix ) 

邮政编码表将略大于 11K-48K 行,大约 30K x 120 = 3.6M 行,但它可以节省您为每个前缀编写不同查询的时间,如果您想搜索纬度和经度(想象一个在 120 个表中搜索的查询)。

如果您不相信,请尝试添加person表,以便为您的用户添加数据。 该表将如何与邮政编码表相关联?


编辑

由于prefix只是postcode的第一个字符,也是primary key ,因此不需要额外的字段或第二个表。 我会简单地将 120 个表合并为一个:

postcode( postcode, lat, lng )

然后查询如下:

SELECT * 
FROM postode
WHERE postcode = 'SE11LD'

或者

SELECT * 
FROM postode
WHERE postcode LIKE 'SE%'

会很快,因为他们将使用主键索引。

只要您在适当的列上有索引,就应该没有问题。 我的一位客户将邮政编码数据库存储在如下表中:

CREATE TABLE `postcode_geodata` (
`postcode` varchar(8) NOT NULL DEFAULT '',
`x_coord` float NOT NULL DEFAULT '0',
`y_coord` float NOT NULL DEFAULT '0',
UNIQUE KEY `postcode_idx` (`postcode`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

我们在查询它时没有问题(从性能的角度来看)。

如果您的表确实变得非常大,那么您总是可以考虑使用 MySQL 的分区支持 - 请参阅http://dev.mysql.com/doc/refman/5.1/en/partitioning.ZFC35FDC70D5FC69D26EZC-A但是直到你先完成了更简单的事情(见下文)。

如果您认为性能是一个问题,请打开 MySQL 的 slow_query_log(参见 /etc/mysql/my.cnf)并查看它的内容(此时您可能还会发现命令 'mysqldumpslow' 对于分析慢查询日志很有用)。

还可以尝试在 MySQL cli 上使用“解释”语法 - 例如

EXPLAIN SELECT a,b,c FROM table WHERE d = 'foo' and e = 'bar'

这些步骤将帮助您优化数据库 - 通过确定哪些索引正在(或未)用于查询。

最后,还有 mysqltuner.pl 脚本(参见http://mysqltuner.pl ),它可以帮助您优化 MySQL 服务器的设置(例如查询缓存、ZCD69B4957F06CD818D7BF3D61980E2 的使用率等),因此会影响 I/O9 的使用率。

暂无
暂无

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

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