MySQL 没有索引 锁全表

<h3 class="title" style="box-sizing: inherit; margin: 8px 0px 15px; padding: 0px; border: 0px; outline: 0px; font-size: 21.3581px; vertical-align: baseline; font-weight: normal; color: rgb(85, 85, 85); line-height: 1.5; font-family: 'Open Sans', Arial, Helvetica, sans-serif; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><pre name="code" class="html">Locks Set by Different SQL Statements in InnoDB


If you have no indexes suitable for your statement and MySQL must scan the entire table to process the statement,
 every row of the table becomes locked, which in turn blocks all inserts by other users to the table. 
It is important to create good indexes so that your queries do not unnecessarily scan many rows.


如果你没有合适的所有用于你的语句,MySQL 必须扫描整个表来处理语句,

每个表的记录被锁定,blocks 所有其他用户插入到这个表


创建好的所有是重要的 这样你查询不需要扫描很多记录



   

转载于:https://www.cnblogs.com/zhaoyangjian724/p/6199065.html

### 添加索引时避免表的最佳实践 在 MySQL 中执行 `ADD INDEX` 操作通常会触发元数据定(metadata lock),这可能导致长时间的阻塞,尤其是在高并发环境中。然而,通过合理配置和优化操作方式,可以减少甚至完全避免这种的影响。 #### 使用在线 DDL 功能 自 MySQL 5.6 起引入了 Online DDL 支持,允许某些类型的 schema 修改在不中断正常查询的情况下完成。对于添加索引的操作,可以通过指定合适的算法来实现无或低的效果: - **ALGORITHM=INPLACE**: 这种方法不会复制整个表的数据,而是直接修改现有的表结构[^3]。 - **LOCK=NONE**: 明确声明在执行期间不需要任何写入,从而允许读取和更新操作继续进行[^4]。 具体命令如下所示: ```sql ALTER TABLE your_table ADD INDEX idx_name(column_list), ALGORITHM=INPLACE, LOCK=NONE; ``` 需要注意的是,并非所有的存储引擎都支持这些选项;MyISAM 不支持真正的在线更改,而 InnoDB 则提供了较好的兼容性[^1]。 #### 配置延迟键写入参数 如果正在使用的确实是 MyISAM 表,则应特别注意外部定机制以及 `delay_key_write` 的设置情况。当启用此功能时,在多进程环境下可能会引发索引损坏的风险,因此建议关闭该特性后再尝试增加新索引[^1]。 另外,考虑到性能因素,有时可能需要权衡是否真的有必要立即应用新的索引定义——特别是在非常繁忙的时间段内。一种替代方案是创建副本表并迁移数据过去之后再做调整。 #### 分批处理大数据集上的变更请求 针对超大规模数据库实例而言,即使启用了 ONLINE 方式也可能因为日志文件增长过快等原因造成实际耗时较长的现象发生。此时可考虑采用分步策略逐步构建辅助列及其关联关系直至最终形成目标索引为止[^2]。 以下是基于 Python 实现的一个简单脚本片段用于演示如何拆解大型事务成多个小型子任务序列以便更好地控制进度条目数目的例子: ```python import mysql.connector def batch_add_index(db_config, table_name, chunk_size): conn = mysql.connector.connect(**db_config) cursor = conn.cursor() try: total_rows = get_total_row_count(cursor, table_name) for offset in range(0, total_rows, chunk_size): sql = f""" INSERT INTO temp_{table_name} SELECT * FROM {table_name} LIMIT %s OFFSET %s; """ cursor.execute(sql, (chunk_size, offset)) # Add index after each small insert operation. create_index_sql = f"CREATE INDEX IF NOT EXISTS my_idx ON temp_{table_name}(some_column);" cursor.execute(create_index_sql) merge_tables(cursor, table_name) # Merge back once all chunks processed. finally: cursor.close() conn.close() # Helper functions omitted here... ``` 以上代码仅为示意用途,请根据实际情况调整逻辑细节以满足特定需求。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值