1

我在 mysql 中有一个大表,大约 100 万条记录。

我在 where 子句和 order 中使用具有不同参数的动态查询,所以我不能使用一些代码,例如AND id > 34000 LIMIT 10

我在WHEREand中的字段上有索引LIMITORDER但索引并不能单独帮助。

我需要一个更好的方法LIMIT 34000, 10,有没有办法解决偏移延迟?

我放置了我的表模式,但我只是复制了更多可用字段而没有任何索引,因为我使用的是动态查询。

CREATE TABLE IF NOT EXISTS `p_apartmentbuy` (
  `property_id` mediumint(8) unsigned NOT NULL,
  `dateadd` int(10) unsigned NOT NULL,
  `sqm` smallint(5) unsigned NOT NULL,
  `sqmland` smallint(5) unsigned NOT NULL,
  `age` tinyint(2) unsigned NOT NULL,
  `price` bigint(12) unsigned NOT NULL,
  `pricemeter` int(11) unsigned NOT NULL,
  `floortotal` tinyint(3) unsigned NOT NULL,
  `floorno` tinyint(3) unsigned NOT NULL,
  `unittotal` smallint(4) unsigned NOT NULL,
  `unitthisfloor` tinyint(3) unsigned NOT NULL,
  `room` tinyint(1) unsigned NOT NULL,
  `parking` tinyint(1) unsigned NOT NULL,
  `renovate` tinyint(1) unsigned NOT NULL,
  `address` varchar(255) COLLATE utf8_general_ci NOT NULL,
  `describe` varchar(500) COLLATE utf8_general_ci NOT NULL,
  `featured` tinyint(1) unsigned NOT NULL,
  `l_location_id` smallint(5) unsigned NOT NULL,
  `l_city_id` smallint(4) unsigned NOT NULL,
  `pf_furnished_id` tinyint(2) unsigned NOT NULL,
  PRIMARY KEY (`property_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
4

2 回答 2

2

具有 1 个轧机记录的表的问题不会是结构AND id > 34000 LIMIT 10LIMIT 34000, 10 查询的其余部分。IE,你需要索引、PK、FK 来加快查询速度,除此之外,Order by 可能会减慢查询速度,进行搜索like '%text%'会使查询速度变慢。这也取决于桌子的引擎

所以不要指望改变限制 10 会产生巨大的影响。有几个工具可以帮助您确定“更好”的查询,但并非所有查询都一样,所以不要指望“最佳解决方案”,因为它不存在。

您可以使用 Show create tableor Describe select ......orexplain查看发生了什么,或使用命令benchmark查看您正在应用的函数的大致时间以改进它

编辑:

MySQL 的一些工具我建议你看看这个程序,它将帮助你提高这部分性能。

  • Mysqlslap(它就像基准,但您可以自定义更多结果)。
  • SysBench(测试 CPU 性能、I/O 性能、互斥争用、内存速度、数据库性能)。
  • Mysqltuner(您可以使用它分析一般统计信息、存储引擎统计信息、性能指标)。
  • mk-query-profiler(执行 SQL 语句分析)。
  • mysqldumpslow(很高兴知道女巫查询会导致问题)。
于 2012-07-05T17:01:15.920 回答
1

如果 MySQL 能够仅使用索引来查找与查询匹配的行,则 MySQL 能够优化 LIMIT 子句(即仅扫描/评估 LIMIT 指定范围内的行)。

对于像这样的查询SELECT * FROM users WHERE active = 1 ORDER BY created_at,在 (active, created_at) 上添加和索引就足够了。

http://www.mysqlperformanceblog.com/2006/09/01/order-by-limit-performance-optimization/

于 2012-07-05T16:58:04.623 回答