iam在一个非常简单的表上解决一些性能问题,当使用其主键(bigint)获取数据时,这个表似乎很慢
我有这个包含 1.24 亿个条目的表:
CREATE TABLE `nodes` (
`id` bigint(20) NOT NULL,
`lat` float(13,7) NOT NULL,
`lon` float(13,7) NOT NULL,
PRIMARY KEY (`id`),
KEY `lat_index` (`lat`),
KEY `lon_index` (`lon`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
以及一个简单的查询,它使用IN子句从另一个表中获取一些id,以从节点表中获取数据,但从这个表中获取几行只需要1小时。EXPLAIN向我展示了它不使用PRIMARY键作为索引,它只是扫描整个表。为什么?另一个表中的id和id列都来自bigint(20)类型。
mysql> EXPLAIN SELECT lat, lon FROM nodes WHERE id IN (SELECT node_id FROM ways_elements WHERE way_id = '4962890');
+----+--------------------+-------------------+------+---------------+--------+---------+-------+-----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-------------------+------+---------------+--------+---------+-------+-----------+-------------+
| 1 | PRIMARY | nodes | ALL | NULL | NULL | NULL | NULL | 124035228 | Using where |
| 2 | DEPENDENT SUBQUERY | ways_elements | ref | way_id | way_id | 8 | const | 2 | Using where |
+----+--------------------+-------------------+------+---------------+--------+---------+-------+-----------+-------------+
查询SELECT node_id FROM ways_elements WHERE way_id='4962890'
只返回两个节点id,因此整个查询应该只返回两行,但需要大约1小时。
使用“强制索引(PRIMARY)”没有帮助,即使它会有所帮助,为什么MySQL不获取该索引,因为它是主键?EXPLAIN 甚至没有在possible_keys列中提及任何内容,但select_type显示 PRIMARY。
我做错了什么吗?
这就是所谓的相关子查询。您可以将此作为参考,也可以将此问题发布在Stackoverflow上。更好的查询是:
SELECT lat,
lon
FROM nodes n
JOIN ways_elements w ON n.id = w.node_id
WHERE way_id = '4962890'
它的性能如何?
选择 lat, lon 从节点 t1 加入 ways_elements t2 on (t1.id=t2.node_id),其中 t2.way_id = '4962890'
我怀疑您的查询正在根据“IN”子句中的每个项目检查节点中的每一行。
本文向大家介绍MySQL索引之主键索引,包括了MySQL索引之主键索引的使用技巧和注意事项,需要的朋友参考一下 在MySQL里,主键索引和辅助索引分别是什么意思,有什么区别? 上次的分享我们介绍了聚集索引和非聚集索引的区别,本次我们继续介绍主键索引和辅助索引的区别。 1、主键索引 主键索引,简称主键,原文是PRIMARY KEY,由一个或多个列组成,用于唯一性标识数据表中的某一条记录。一个表可以没
问题内容: 我有一个将包含数百万个条目的表,以及一个具有每行唯一的值的列。它们不是主键,但是在某些操作期间,有数千个在子句中使用此列。 问: 当条目数量增加到数百万时 ,向该列添加索引是否有帮助 ?我知道它将用于文本值,但是我不熟悉索引对or的作用。 可能发生数千次的示例与此类似: 问题答案: 如果表非常大,那么对未索引的值进行搜索可能会非常慢。用MySQL术语来说,这种查询最终是“表扫描”,这是
主要内容:一、索引概述,1.索引的分类,二、索引的创建,1.创建表时创建索引,2. 在已经存在的表上创建索引,三、删除索引,四、隐藏索引,五、哪些情况下适合创建索引,1.频繁作为 WHERE 查询条件的字段,2. 有唯一性限制的字段,3.经常GROUP BY和ORDER BY的列,4.UPDATE、DELETE的WHERE条件列,,5.DISTINCT字段需要创建索引,6.多表JOIN连接操作时,7. 使用列的类型小的创建索引,,,,,,,,,,,,上一篇我们主要是对索引设计体系的一个讲解,本篇
问题内容: 如果该 对 不存在,如何插入一行? *注意这些不是主键,我的主键设置为自动增量, 尝试插入时忽略但不起作用 表格看起来像: 问题答案: 1)您可以在上添加约束吗?如果是,请添加此约束并使用: 并忽略产生警告(或将替换为) 2)如果您不能添加这样的约束(例如,有时您希望允许这样的重复项而其他时候则不允许),则可以使用以下方法:
我创建了一个带有主键(UsersID、AccountsID)的帐户/用户表,如下所示。我是否应该为Users表添加索引?
本文向大家介绍Mysql中SQL语句不使用索引的情况,包括了Mysql中SQL语句不使用索引的情况的使用技巧和注意事项,需要的朋友参考一下 MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多时候,即使增加了索引,查询仍然不使用索引,这种情况严重影响性能,这里就简单总结几条MySQL不使用索引的情况 如果MySQL估计使用索引比全表扫描更慢,则不使用索引。例如,如果列