mysql - 加速本地MySql对大表发起规范化查询

标签 mysql mariadb

我正在标准化和“清理”一个 MySql 数据库,其中最大的表约有 300 万条记录。

我要做的是重命名一些字段(非常快),更改它们的顺序(相当快),并进行一些修剪、字符串清理、将一些字段提取到其他表并保留外键 ID...

有没有办法可以加快本地计算机上的查询速度?

我有 MariaDB 10.1.21(来自 XAMPP),并在 MacBook Air 8GB Ram 上运行。

我已经在许多字段上放置了索引,但它仍然慢得像乌龟。

任何提示将不胜感激。谢谢!

编辑:根据要求提供更多信息和我正在执行的一些优化。

我基本上有一个大表,其中包含未标准化的列,这些列通常分布在三个表中。

我有:

companies ( id, name, street, city_name, category_name, subcategory_name )

我想要什么

companies ( id, name, street, id_city, id_subcategory, ... )
cities( id, name, ... )
categories( id, name )
subcategories( id, name, id_category )

所以我清理并提取数据如下。

修剪并清理“脏”字段中的回车符:

update companies set mic_cat = TRIM(REPLACE(REPLACE(mic_cat, '\r', ''), '\n', ''));

删除类别不正确的公司。

delete from companies where mic_cat is null or mic_cat = '' or mac_cat is null or mac_cat = '';

从字段中提取数据并将其放入新表中:

insert into categories (name) select distinct mac_cat from companies;
insert into subcategories (name, id_category) select distinct mic_cat,categories.id from companies JOIN categories ON mac_cat = categories.name;

添加 id_reference:

ALTER TABLE companies ADD COLUMN id_subcategory int;

拿到 key ...

UPDATE companies left join subcategories on companies.mic_cat = subcategories.name set id_subcategory = subcategories.id;

最后一个非常慢,所以,我删除了所有索引,然后只在companys.mic_cat和subcategories.name上创建了两个索引,它已经紧固了很多。

最佳答案

  • 在单个 UPDATE 语句中执行所有更新。
  • 如果您需要修改索引中的列,请先DROP 这些索引,然后再ADD 返回。 (这可能有帮助。)
  • 在单个 ALTER 语句中执行所有 ALTER。 (这并不总是最好的建议。)
  • 考虑以行 block 的形式进行更新。

上述尝试解决的一些问题:

    不带 WHERE 子句(有时带 WHERE)的
  • UPDATE 将扫描整个表,成本相当高。
  • 修改索引列时,需要将索引中的行从索引中的一个位置删除并添加到另一个位置。将其视为DELETE 加上INSERT——成本相当高。
  • ALTER 可能或可能无法“就地”完成工作。如果无法以这种方式完成多个更改,那么最好执行单个副本(即单个 ALTER)来同时执行所有更改。它有效地创建一个新的空表,对其进行更改,将所有数据复制到其中,重新创建所有索引,然后将其重命名回原位。

有关索引的更多信息...

  • 不索引标志;此类索引将被避开。
  • 查看您的 WHERE 子句,了解哪些索引有用。
  • 了解“复合”索引:INDEX(a,b) 可能INDEX(a)、INDEX(b) 好得多 对于一些查询。
  • 不要盲目地为每一列建立索引——这是一种很大的浪费。

3M 行可能很多。在许多情况下,最好在“ block ”中UPDATE(或DELETE)。请参阅my blog .

关于mysql - 加速本地MySql对大表发起规范化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44206093/

相关文章:

php - 使用 MySQL 和 PHP 查找重复内容

java - 如何在 Linux 上使用用户名和密码连接到我的 mysql 数据库

MySQL:根据不同列的变化对列进行顺序编号

mysql - 想要更好地了解此查询的工作原理?

mysql - “mysql”不被识别为内部或外部命令

php - 针对两个 php 变量的多表全文搜索

php - 无法将从数据库中检索到的信息插入到表单中

ubuntu - Zabbix 服务器启动失败

php - Twitter Typeahead 标签从 MySQL 获取数据

mysql - MariaDB(或MySQL)是否需要SSL证书以确保安全