在mysql和php之间的性能和排序以及独特的独特性
在像这样的情况下,哪种方法或哪种方法混合执行最快?在mysql和php之间的性能和排序以及独特的独特性
$year = db_get_fields("select distinct year from car_cache order by year desc");
或者
$year = db_get_fields("select year from car_cache");
$year = array_unique($year);
sort($year);
我听说过关于MySQL的不同是大型查询一个真正的大的性能损失,这表只能有一百万行以上。我想知道什么样的数据库类型Innodb或MyISAM的组合最适合。我知道很多优化都是非常依赖查询的。 Year是一个无符号数字,但其他字段是不同长度的varchar我知道这也可能有所不同。如:
$line = db_get_fields("select distinct line from car_cache where year='$postyear' and make='$postmake' order by line desc");
我读到,使用新的innodb多键方法可以使这样的查询非常非常快。但条款的独特和顺序是我的红旗。
让MySQL做尽可能多的工作。如果它在做什么时效率不高,那么事情可能没有正确设置(无论是正在尝试运行的查询的索引还是使用排序缓冲区的设置)。
如果您有year
列的索引,那么使用DISTINCT
应该是有效的。如果你不这样做,那么为了获取不同的行,必须进行全表扫描。如果您尝试在PHP中而不是MySQL中对不同的行进行分类,那么您可能将更多的数据从MySQL传输到PHP,并且在消除重复之前,PHP会消耗更多的内存来存储所有数据。
这是我从一个开发数据库的一些示例输出。另请注意,此数据库位于执行查询的网络上的其他服务器上。
SELECT COUNT(SerialNumber) FROM `readings`;
> 97698592
SELECT SQL_NO_CACHE DISTINCT `SerialNumber`
FROM `readings`
ORDER BY `SerialNumber` DESC
LIMIT 10000;
> Fetched 10000 records. Duration: 0.801 sec, fetched in: 0.082 sec
> EXPLAIN *above_query*
+----+-------------+----------+-------+---------------+---------+---------+------+------+-----------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-----------------------------------------------------------+
| 1 | SIMPLE | readings | range | NULL | PRIMARY | 18 | NULL | 19 | Using index for group-by; Using temporary; Using filesort |
+----+-------------+----------+-------+---------------+---------+---------+------+------+-----------------------------------------------------------+
如果我试图相同的查询,除了一个是未编入索引,那么它永远运行,因为MySQL有检查全部97万行更换SerialNumber
列。
一些效率与您期望得到的数据量有关。如果我稍微修改上述查询以在time
列(读数的时间戳)上进行操作,则需要花费1分40秒来获得273,505次的明确列表,其中大部分开销是将所有记录通过网络。因此,请记住您获取多少数据的限制,您希望尽可能降低您尝试获取的数据的数据量。
至于你的最终查询:
select distinct line from car_cache
where year='$postyear' and make='$postmake'
order by line desc
应该有与不成问题,只要确保你在year
和make
,并可能对line
指数具有复合指数。
关于最后一点,我使用的读数表的引擎是InnoDB的,我的服务器是:5.5.23-55-log Percona Server (GPL), Release 25.3
这是Percona的公司
希望帮助一个版本的MySQL。
对于最终的查询,最好的索引可以是'(年,make,line)'或'(make,year,line)' – 2012-07-31 18:43:17
伟大的彻底的答案不能要求更好的谢谢:) – Wolfe 2012-07-31 20:33:42