在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 

应该有与不成问题,只要确保你在yearmake,并可能对line指数具有复合指数。

关于最后一点,我使用的读数表的引擎是InnoDB的,我的服务器是:5.5.23-55-log Percona Server (GPL), Release 25.3这是Percona的公司

希望帮助一个版本的MySQL。

+1

对于最终的查询,最好的索引可以是'(年,make,line)'或'(make,year,line)' – 2012-07-31 18:43:17

+0

伟大的彻底的答案不能要求更好的谢谢:) – Wolfe 2012-07-31 20:33:42