当前位置: 首页 > 知识库问答 >
问题:

MySQL选择计数与组和顺序性能问题

闾丘炫明
2023-03-14

事实:

  • 专用服务器,4核,16GB
  • MySQL 5.5.29-0Ubuntu0.12.10.1-log-(Ubuntu)
  • 一个表,1.9百万行,并且还在增长
mysql> SHOW CREATE TABLE data \G;
*************************** 1. row ***************************
       Table: data
Create Table: CREATE TABLE `data` (
  `data_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `rel_id` int(11) NOT NULL,
  `some_text` varchar(255) DEFAULT NULL,
  `lang` varchar(3) DEFAULT NULL,
  `some_bool` tinyint(1) DEFAULT NULL,
  `some_filter` varchar(40) DEFAULT NULL,
  `ano_filter` varchar(10) DEFAULT NULL,
  `day` int(11) DEFAULT NULL,
  PRIMARY KEY (`data_id`),
  KEY `cnt_idx` (`some_filter`,`ano_filter`,`rel_id`,`lang`,`some_bool`,`some_text`,`day`)
) ENGINE=MyISAM AUTO_INCREMENT=1900099 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

查询

mysql> EXPLAIN SELECT `some_text` , COUNT(*) AS `num` FROM `data` 
 WHERE `lang` = 'en' AND `day` BETWEEN '1364342400' AND
 '1366934399' GROUP BY `some_text` ORDER BY `num` DESC \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: data
         type: index
possible_keys: NULL
          key: cnt_idx
      key_len: 947
          ref: NULL
         rows: 1900098
        Extra: Using where; Using index; Using temporary; Using filesort
1 row in set (0.00 sec)
mysql> SELECT `some_text` , COUNT(*) AS `num` FROM `data` 
 WHERE `lang` = 'en' AND `day` BETWEEN '1364342400' AND '1366934399' 
 GROUP BY `some_text` ORDER BY `num` DESC LIMIT 5 \G;
...
*************************** 5. row ***************************
5 rows in set (24.26 sec)

你知道怎么加快那东西的速度吗?“

共有1个答案

饶志
2023-03-14

由于索引中的列顺序,没有使用索引。索引从左到右工作。要使该查询使用索引,需要lang,day的索引。

 类似资料:
  • 问题内容: 我有类似的东西 如果我只是这样做,它将以ID升序返回行。有没有一种方法可以按照IN语句中给出的顺序取回行? 问题答案: 您应该使用“ ORDER BY FIELD”。因此,例如:

  • 问题内容: 这两个查询在具有1000万行的表上运行缓慢。我想知道为什么为什么从mysql保留所有insert,update和delete更新的计数器变得不容易? 有没有办法改善这个查询?我使用了说明,但并没有太大帮助。 问题答案: 正如cherouvim在评论中指出的那样,它取决于存储引擎。 确实会保留表行的计数,并且由于MyISAM支持的唯一锁是表锁,因此可以保持准确。 但是支持事务,因此需要进

  • 本文向大家介绍MySQL选择按值计数?,包括了MySQL选择按值计数?的使用技巧和注意事项,需要的朋友参考一下 您可以为此使用功能。让我们首先创建一个演示表 使用insert命令在表中插入一些记录。查询如下- 使用select语句显示表中的所有记录。查询如下- 以下是输出 这是选择按值计数的查询 以下是输出

  • 问题内容: 从MySQL中的多个表中选择时,以下两个查询均返回相同的结果集。 这些查询中的一个比另一个查询 更好 或更有效吗?根据我在一个小的数据集(每个表中约有2000行)的测试中,它们都在大约相同的执行时间上返回了相同的结果集。 查询1: 查询2: 问题答案: 它们是相同的,但是语法不同。因此,您不应该期望这两种语法之间的性能差异。但是,建议使用最后一种语法(ANS SQL-92语法),有关更

  • 问题内容: 我想找到更快的:结构与数组。因此,我编写了一个GO代码,在其中我将4个int值(1、2、3和4)写入一个结构的成员,然后写入一个长度为4的数组。我试图找出写入所需的时间。 案例1:首先,我将值写入结构,然后写入数组。在这里,我发现数组比结构要快。 情况2:其次,我将值写入数组,然后写入结构。在这里,我发现结构比数组要快。 为什么性能取决于我首先写的内容​​?我首先写的那个似乎慢一些。为

  • 基本上,对于每个user_id,我需要类似的东西, 我想最终的结果只是返回所有的总数。