Mysql索引创建删除及使用的代价是什么

你好,我们来谈谈数据库。
我在一家公司从事数据库优化工作,遇到了很多陷阱。
记得有一次给一张大表创建了联合索引,空间使用量翻了好几倍。
然后我就想,这棵B+树到底是什么?为什么索引一创建就占用这么多空间?
我们对空间成本有深入的了解。
有一次,我们的数据库存储空间不足。
经核实,确认这都是创建索引导致的。
当时表中包含的数据量并没有那么大,但是索引的数量却相当多。
结果,B+树层次变得更深,占用更多空间。
就像堆叠积木一样,层数越多,需要的空间就越大。

时间成本也是一个令人头疼的问题。
创建索引时需要扫描全表数据并构建B+树,该过程非常耗时,尤其是大表。
有一次,我创建了一个索引,但是数据库停止了,写入成了问题。
那时我就​​知道我必须谨慎使用这个东西。

我们来谈谈删除索引的成本。
关于空间回收,删除索引可以释放空间,但可能会因回收过程而暂时影响性能。
另外,删除索引需要更新数据字典中的索引信息。
即使需要很长时间,你也不能忽视它。

说到使用索引的成本,写操作的性能损失是非常明显的。
例如,在插入、删除或更新数据时必须保持B+树的对齐,这会增加I/O和CPU开销。
高并发写入可能会导致锁定冲突并降低吞吐量。

查询优化的决策成本也是相当可观的。
优化器必须评估所有可用索引的成本并选择最佳执行路径。
如果索引太多,优化器将难以分析,并且优化步骤可能会花费太长的时间。

还存在索引选择性不足的问题。
例如,如果特定字段只有几个值,优化器可能会简单地放弃使用索引并选择全表扫描。
这时候索引就没用了,浪费空间。

一般来说,索引如果使用得当可以提高性能,但如果使用不当可能会适得其反。
建议针对频繁查询条件和高选择性列创建索引,并定期清理无用索引,这样不仅可以提高性能,还可以减轻维护负担。
这个问题需要一个策略。
😄

mysql删索引

上周有客户问,如何删除MySQL中的列表?我告诉他要小心这一点,他通过使用 DROPINDEX 命令使其发挥作用。
就像,DROPINDEX index_name FROM table_name;,其中index_name是要删除的索引的名称,table_name是索引所在的表的名称。

例如,要删除students表中的idx_id索引,命令为DROPINDEX idx_id ON Students;。
这个操作是完全开放的。
直接杀死索引,释放占用空间,减轻数据库维护压力。

但这不可能是偶然发生的。
首先要考虑的是是否应该使用这个列表。
如果您习惯于更频繁地加快查询速度,那么删除它们可能会适得其反。
如果您有一个缓慢的分析查询或日志,请使用expand命令来查看实际索引的结果。

另外,不要意外删除系统索引,例如主索引和个别索引。
这些通常是自动创建的。
手动删除它们可能会弄乱数据结构。

操作前最好在环境中测试一下,看看删除列表是否会影响查询性能。
如果没有疑问,请考虑在生产环境中工作。

针对适用场景,例如多个索引覆盖同一列,可以删除一些重复项;再比如,如果某一列的数据更新频繁,那么对其建立索引可能比查询效率更高,此时也可以考虑将其删除。

综上所述,索引删除是一种优化性能的好方法,但必须严格遵循规范,避免因误删除而导致系统性能下降。
无论如何,这取决于你。
我还在思考这个问题,因为它涉及到数据库的稳定性和性能。

mysql查看、创建和删除索引的方法

SHOW FROM table_name;
CREATE INDEX index_name ON table_name(column_name);
CREATE UNIQUE INDEX index_name ON table_name(column_name);
CREATE FULL INDEX index_name ON table_name(column_name) AS VARCHAR;
DROP INDEX index_name ON table_name;
不要直接在产品区域中移动,先试试。