我正在标准化和“清理”一个 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 的形式进行更新。
上述尝试解决的一些问题:
-
不带
UPDATE
将扫描整个表,成本相当高。- 修改索引列时,需要将索引中的行从索引中的一个位置删除并添加到另一个位置。将其视为
DELETE
加上INSERT
——成本相当高。 ALTER
可能或可能无法“就地”完成工作。如果无法以这种方式完成多个更改,那么最好执行单个副本(即单个ALTER
)来同时执行所有更改。它有效地创建一个新的空表,对其进行更改,将所有数据复制到其中,重新创建所有索引,然后将其重命名回原位。
WHERE
子句(有时带 WHERE
)的 有关索引的更多信息...
- 不索引标志;此类索引将被避开。
- 查看您的
WHERE
子句,了解哪些索引有用。 - 了解“复合”索引:
INDEX(a,b)
可能比INDEX(a)、INDEX(b) 好得多
对于一些查询。 - 不要盲目地为每一列建立索引——这是一种很大的浪费。
3M 行可能很多。在许多情况下,最好在“ block ”中UPDATE
(或DELETE
)。请参阅my blog .
关于mysql - 加速本地MySql对大表发起规范化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44206093/