加速本地MySql以在大表上启动规范化查询

时间:2017-05-26 16:20:28

标签: mysql mariadb

我正在规范化并“清理”一个MySql数据库,其中最大的表计数约为3百万条记录。

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

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

我是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;

获取钥匙......

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

最后一个非常慢,因此,我删除了所有索引,然后在companies.mic_cat和subcategories.name上创建了两个索引,它已被固定了很多。

1 个答案:

答案 0 :(得分:0)

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

以上试图解决的一些问题:

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

有关索引的更多内容......

  • 不要索引标志;这些指数将被避开。
  • 查看您的WHERE子句,了解哪些索引有用。
  • 了解“复合”索引:INDEX(a,b) 可能某些查询的INDEX(a), INDEX(b)要好得多。
  • 不要盲目索引每一栏 - 这是一个很大的浪费。

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