我正在规范化并“清理”一个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上创建了两个索引,它已被固定了很多。
答案 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。