Mysql 添加索引可以增加查询执行

Mysql 添加索引可以增加查询执行,mysql,Mysql,当我将索引添加到列中时,它会减慢执行时间,这怎么可能呢? 正在尝试从慢速查询日志中删除查询。 我的慢速查询设置: slow_query_log = 1 long_query_time = 1 # seconds log_queries_not_using_indexes = 1 slow_query_log_file = /var/log/mysql-slow.log 根据磁盘上数据的结构,只加载整个db/列并在ram中对其进行排序/过滤可能比遍历磁盘上的稀疏索引更快,这在没有索引的情况下可

当我将索引添加到列中时,它会减慢执行时间,这怎么可能呢? 正在尝试从慢速查询日志中删除查询。 我的慢速查询设置:

slow_query_log = 1
long_query_time = 1 # seconds
log_queries_not_using_indexes = 1
slow_query_log_file = /var/log/mysql-slow.log

根据磁盘上数据的结构,只加载整个db/列并在ram中对其进行排序/过滤可能比遍历磁盘上的稀疏索引更快,这在没有索引的情况下可能会发生。我不知道这是否适用于您的特定上下文,或者您在这里是否还有其他问题。

根据磁盘上数据的结构,只加载整个db/列并在ram中对其进行排序/过滤可能比遍历磁盘上的稀疏索引更快,这在没有索引时可能会发生。我不知道这是否适用于您的特定上下文,或者您是否还有其他问题。

索引并不总是能够加快执行速度。索引的效果主要取决于查询的选择性:整个查询处理多少行

通常,通过全表扫描读取数据库是一种有效的操作。数据库引擎知道需要读取哪些页面,并且可以提前读取以获取这些页面。这种I/O通常发生在后台,而在前台处理页面。但是,当需要下一页时,它很可能已经在页面缓存中

全表扫描的性能问题是表太大。因此,即使是高效的阅读也需要时间。在大海捞针的查询中查找百万分之一行时,读取是浪费时间。这就是索引解决问题的地方

但是,假设您每页有100条记录,并且您正在读取超过1%的记录。平均而言,无论您使用的是索引还是完整表扫描,都需要读取每个页面。问题是索引读取的效率低于扫描读取。预读机制对他们没有帮助,因为读取是随机的

这一问题可以通过一种称为打击的方式进一步恶化。如果表不适合内存,则每次随机读取都可能是缓存未命中,从而导致从磁盘读取的开销。全表扫描只需读取数据,并且使用一个良好的前瞻系统,就不会出现缓存未命中


在您的示例中,您可以通过在索引中同时包含标题和事件来提高索引的选择性。这些标题和事件使用相等字段和其他字段之一进行比较。

索引并不总是能够加快执行速度。索引的效果主要取决于查询的选择性:整个查询处理多少行

通常,通过全表扫描读取数据库是一种有效的操作。数据库引擎知道需要读取哪些页面,并且可以提前读取以获取这些页面。这种I/O通常发生在后台,而在前台处理页面。但是,当需要下一页时,它很可能已经在页面缓存中

全表扫描的性能问题是表太大。因此,即使是高效的阅读也需要时间。在大海捞针的查询中查找百万分之一行时,读取是浪费时间。这就是索引解决问题的地方

但是,假设您每页有100条记录,并且您正在读取超过1%的记录。平均而言,无论您使用的是索引还是完整表扫描,都需要读取每个页面。问题是索引读取的效率低于扫描读取。预读机制对他们没有帮助,因为读取是随机的

这一问题可以通过一种称为打击的方式进一步恶化。如果表不适合内存,则每次随机读取都可能是缓存未命中,从而导致从磁盘读取的开销。全表扫描只需读取数据,并且使用一个良好的前瞻系统,就不会出现缓存未命中


以你为例,,您可以通过在索引中同时包含横幅和事件来提高索引的选择性。使用相等字段和其他字段进行比较。

您使用的是InnoDB还是MyISAM?当您希望对查询进行基准测试时,请添加SQL\u NO\u缓存,因为第二个查询可能会得到结果,因此结果可能会受到影响谢谢你,一直在学习。我更新了图像。索引并不神奇,一个坏的索引会减慢查询速度。存在一种叫做基数的东西。这是一个数字,告诉我们一个集合中有多少个唯一的值。在集合1,2,2中有4个成员,但只有2个唯一值。如果您有一个列标题,并且在列有10个唯一值时对其进行索引-如果您有200k行,则基数为10/200000。这是一个很低的数字,MySQL不会得到任何好处。因此,使用主键的操作速度很快,因为PK基数始终为1。您使用的是InnoDB还是MyISAM?当您希望对查询进行基准测试时,请添加SQL\u NO\u缓存,因为结果
由于第二个查询可以从mysql缓存中获得结果,因此可能会受到影响。谢谢,一直在学习。我更新了图像。索引并不神奇,一个坏的索引会减慢查询速度。存在一种叫做基数的东西。这是一个数字,告诉我们一个集合中有多少个唯一的值。在集合1,2,2中有4个成员,但只有2个唯一值。如果您有一个列标题,并且在列有10个唯一值时对其进行索引-如果您有200k行,则基数为10/200000。这是一个很低的数字,MySQL不会得到任何好处。因此,使用主键的操作速度很快,因为PK基数始终为1。尝试添加索引横幅和事件更改表mod_banner添加索引横幅_event banner,event,但仍然超过100ms:P通过即时删除顺序。但是我需要最后一个视图最低的一个问题:如果从索引中读取会影响性能,为什么引擎不决定不使用它们呢?与其处理解决方案处理顺序的位置,不如在最后一个视图列@JanDvorak-MySQL上添加索引来计算索引基数。如果基数低于幻数,老实说,我不记得那个数字是什么,那么它更喜欢表扫描。然而,MySQL不知道遍历索引是否会比扫描表快,因为据我所知,索引算法的实现取决于所使用的引擎。在本例中,它是MyISAM,显然它的B树实现不如InnoDB。我读到很多人说InnoDB的B-tree实现是最好的实现之一。尝试添加索引横幅和事件更改表mod_banner添加索引横幅_event banner,event,但仍然超过100ms:P通过即时删除顺序。但是我需要最后一个视图最低的一个问题:如果从索引中读取会影响性能,为什么引擎不决定不使用它们呢?与其处理解决方案处理顺序的位置,不如在最后一个视图列@JanDvorak-MySQL上添加索引来计算索引基数。如果基数低于幻数,老实说,我不记得那个数字是什么,那么它更喜欢表扫描。然而,MySQL不知道遍历索引是否会比扫描表快,因为据我所知,索引算法的实现取决于所使用的引擎。在本例中,它是MyISAM,显然它的B树实现不如InnoDB。我读到很多人说InnoDB的B-tree实现是最好的实现之一。