问题标签 [myisam]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
5386 浏览

sql - MySQL + MyISAM 中的“系统锁”

我注意到我们的 MySQL 服务器上的“显示进程列表”表明许多线程处于“系统锁定”状态,通常后面跟着“锁定”,我希望后者是因为我们在更新/插入后面有一些选择锁定MyISAM 表。

但是“系统锁定”显示的不仅仅是“锁定”(根据分析器的说法,有时一个简单的选择会增加 2 秒),我不明白它表示什么。我在网上找不到太多关于系统锁的信息,但是那里主要讨论了多个 mysqld 访问同一个数据库的情况,这不是我的情况。此外,我的“跳过外部锁定”变量是错误的。

有人有这方面的经验吗?

附录:

如果它有帮助,我倾向于在进程列表中看到比表锁('Locked')更多的系统锁大约 3 比 1。是否有可能出于某种原因输出“系统锁”以用于有效的常规表锁定?

0 投票
4 回答
2097 浏览

sql - 在实时 myISAM 表上添加索引的最简单方法是什么?

我有一个在 mySQL 上运行的 myISAM 表,通过进行一些测试,我们发现我们可以通过添加某个复合索引来极大地加快查询速度。到现在为止还挺好。但是,我并不是在不长时间锁定表的情况下在生产环境中添加此索引的最佳方法(它有 27GB 的数据,所以不多,但确实需要一段时间)。

你有什么建议吗?如果这是一个更复杂的设置,我们当然会在另一台机器上拥有所有数据的实时副本,我们可以安全地切换。不幸的是,我们还没有到那里,我想尽快加快这个查询(这引起了客户的大麻烦)。是否有一些简单的方法来复制数据然后进行交换技巧?我还缺少其他一些技巧?

更新:阅读 SQL Server 中的“在线索引操作”让我非常嫉妒http://msdn.microsoft.com/en-us/library/ms191261.aspx :)

谢谢!

0 投票
2 回答
1462 浏览

sql - 像检查约束一样的约束,而不是 MySQL 中 MyISAM 存储引擎的空约束

我们可以在 MySQL 中的 MyISAM 存储引擎上使用检查约束之类的约束,而不是 null 约束吗?

0 投票
5 回答
3798 浏览

mysql - 当我们构建集群存储时,MyISAM 引擎是否比 InnoDB 更可取?如果是这样,为什么?

我今天在面试 Java 开发人员时听到了这个消息。我必须列出 MyISAM 相对于 InnoDB 的一些优势,以及为什么它仍然被广泛使用。他们正在等待我的答案作为这个问题的标题。

正如我从他们自己的回答中了解到的那样:MyISAM 没有外键,数据库可以很容易地集群(例如,每台服务器一个表)。但是为什么我们不能简单地创建没有外键的 InnoDB 表呢?这个解释对我来说听起来很奇怪..

0 投票
2 回答
1522 浏览

mysql - MySQL MyISAM 磁盘绑定扩展问题/驱动器缓存

我有以下查找表:

我有一个具有相同结构但没有键的 widgetuser_tmp 表,我用这些数据(4mio 行)填充了 widgetuser 表:

在写入时,它以 15MB/s 的速度直接进入 RAID-1,磁盘利用率 <50%,我们看不到读取,因为我用源表填充了磁盘缓存:

我插入接下来的 1 个 Mio 行,一切都很好,刷新后 wMB/s 立即回到 0:

但是当我做 7mio 批处理时,结果看起来还是一样的,但是iostat -mdx sda sdb 5突然我们有 100% util 30 秒:

刷新后不触及数据文件:

并且表格状态接缝正常:

当我继续时(因为我们有 100% 的驱动器利用率),它变得非常快:

检查主键以查看新条目是否唯一。一旦密钥不适合内存(key_buffer_size=512MB = ca. 8Mio 条目),它需要从驱动器(-cache)中获取丢失的密钥部分以进行检查。因此,我们应该看到更多的读取和更慢的插入时间——我们看不到更慢的读取,因为密钥被缓冲在磁盘缓存中。但我的问题是:谁突然写了这么多,在哪里,为什么以及如何解决这个问题?任何想法表示赞赏!

进一步的想法和见解:

  • 由于 1MB/s 随机写入跟随完成的语句,唯一验证已经通过
  • 它是一个启用了 ahci 的软件 raid-1,磁盘有 93% 空闲,速度约为 80wMB/s
  • 这台机器有 8GB 内存,5GB 缓存,600MB 被 MySQL 占用,1,7GB 免费
  • MySQL 5.1.31-1ubuntu2-日志
  • delay_key_write 不会改变这种行为
  • myisam_sort_buffer_size = 2 GB(但这里没有使用?)
  • key_buffer_size = 512 MB
  • bin_log 已关闭
  • Linux 2.6.28-15-server #52-Ubuntu SMP Wed Sep 9 11:34:09 UTC 2009 x86_64 GNU/Linux
0 投票
4 回答
1084 浏览

mysql - 不断变化的数据的最佳存储引擎

我目前有一个应用程序使用 130 个 MySQL 表,所有表都带有 MyISAM 存储引擎。每个表每秒都有多个查询,包括选择/插入/更新/删除查询,因此数据和索引不断变化。

我面临的问题是硬盘无法应对,I/O 访问的等待时间长达 6 秒以上,而 MySQL 完成了如此多的读/写操作。

我正在考虑更改为仅 1 个表并使其基于内存。不过,我从来没有将内存表用于有这么多查询的东西,所以我想知道是否有人可以就这是否是正确的做法给我任何反馈?

0 投票
2 回答
4117 浏览

mysql - 索引不适合 key_buffer 时的快速 MySQL 批量加载

这里有一个关于如何正确配置 mysql (myisam) 以便快速执行批量插入(加载数据文件)的问题。

要导入 6 Gb 文本文件,1500 万行,16 列(一些 int,一些 varchar(255),一个 varchar(40),一个 char(1),一些 datetime,一个 mediumtext)。

相对 my.conf 设置:

共有三个索引 - 一个主索引(autincrement int)、一个唯一 int 和一个唯一 varchar(40)。

问题是在执行 load data infile 命令后,前 3 gigs 的数据被快速导入(基于 table.myd 的大小增加 - 5-8 mb/s),但是一旦超过 3020 Mb 就会限制导入速度大大减少 - table.myd 的大小正在增长 0.5mb/s。Key_blocks_unused我注意到,导入过程会在耗尽为零时减慢。这些是mysql> show status like '%key%';导入开始时的输出:

这就是它在 3020Mb 限制之后的样子,即当下key_blocks_unused降到零时,这就是批量插入过程变得非常慢的时候:

问题很清楚,据我了解 - 索引存储在缓存中,但是一旦缓存填满,索引就会被一一写入磁盘,这很慢,因此所有过程都会减慢。如果我禁用基于 varchar(40) 列的唯一索引,因此所有索引都适合Key_blocks_used(我猜这是直接依赖的变量key_buffer,不是吗?),所有批量导入都是成功的。所以,我很好奇,如何让 mysqlKey_blocks_used一次将所有数据放入磁盘,并释放Key_blocks_used?. 我知道它可能会即时进行一些排序,但是我想它应该可以进行一些缓存的 RAM 磁盘同步,以便成功管理索引,即使它们并不完全适合内存缓存. 所以我的问题是“如何配置 mysql 以便批量插入避免在(几乎)每个索引上写入磁盘,即使所有索引都不适合缓存?" 最后一点 - 对于给定的表,delay_key_write 设置为 1,尽管与禁用时相比,它没有增加任何加速。

提前感谢您的任何想法、想法、解释和 RTM!(:

还有一个小问题——在达到 0 之前,我将如何计算有多少 varchar(40) 索引可以放入缓存Key_blocks_unused

PS 禁用索引,$myisamchk --keys-used=0 -rq /path/to/db/tbl_name然后使用 重新启用它们$myisamchk -rq /path/to/db/tbl_name,如Mysql 文档中所述,这是一种已知的解决方案,该解决方案有效,但仅在批量插入空表时才有效。当表中已经有一些数据时,索引唯一性检查是必要的,因此禁用索引不是解决方案。

0 投票
2 回答
884 浏览

mysql - MySQL存储引擎决策

我是来自荷兰的网页设计师。我对从头开始构建 Web 应用程序有点陌生,我一直使用 CMS,并对其进行了定制。

我正在用 php/mysql 建立一个拍卖网站,已经完成。最近我读了几篇关于存储引擎的文章。

我有几个问题困扰了我一段时间:


哪种存储引擎最适合我的网站,我使用 myIsam、innodb 等吗?

我正在建立的网站是一个拍卖网站,它必须每秒钟处理几次读写!它必须检查拍卖是否开放、关闭、暂停、当前价格等。

我知道并不是我的数据库中的所有表都会被访问,这些只有 3 个。它们目前都是 myIsam。这个好吗?我应该全部改变吗?一个都不改?我真的不知道该怎么办。如果我改变它们,这会极大地影响我的网站吗?这些变化最终会很容易应用,还是很难做到。


我的另一个问题是关于缓存系统。

我也阅读了一些关于它们的信息,但我不知道它们是否适用于我拥有的那种网站。我从数据库中得到的数据变化很大。我缓存它们方便吗?例如,可以缓存拍卖,因为并非所有项目都会更改。但拍卖不会永远存在,几个小时后它就消失了。

我看不出缓存系统如何适用于此,或者我看错了。再说一次,如果这个系统适用于我,这种改变会不会需要很大的努力,这种努力会不会产生巨大的改变。


这些都是我的问题,我想它们真的很笼统,我希望有人能帮助我,我真的很感激。

问候

0 投票
1 回答
7461 浏览

mysql - MyISAM 表在 phpMyAdmin 中的“内部关系”有什么作用?

在 MyISAM 表的 phpMyAdmin v2.8.2.4 中,“关系视图”出现在“结构”选项卡下。它显示了内部关系列表。但是,鉴于 MyISAM 不支持外键约束或关系完整性,这些有什么作用呢?

通过 phpMyAdmin 版本 3.2.0.1,此页面(“关系视图”)不再出现​​在 MyISAM 表中。那么这是否意味着它一开始什么也没做呢?

任何解释都非常感谢。贾斯汀

0 投票
2 回答
771 浏览

mysql - InnoDb 比 MyISAM 更适合频繁的并发更新和插入,我说得对吗?

我们的网站每天有数百名访问者,每天有数万次查询。因此,数据库中的某些表很少更新,有些表每分钟更新几次,有些表每秒更新约 10 次。
MyISAM 使用表级锁定进行更新,而 InnoDb 使用行级锁定。
因此,据我了解,对于具有频繁并发更新(每秒几次更新)的表,最好将它们设为 InnoDb,而对于其他表(当然,如果我们不需要事务和外键)则可以使用MyISAM 引擎。
我的想法是对的吗?