MySQL的非严谨模式对数据库管理的重要影响(mysql 不严谨模式)
MySQL的非严谨模式:对数据库管理的重要影响
MySQL是应用最广泛的关系型数据库之一,其严谨的数据管理模式在大多数情况下能够保证数据的完整性和一致性,但一些开发者在使用MySQL时可能会选择非严谨模式,在一些特殊情况下会带来方便和效率提高,但同时也存在一些重要的影响和风险。
MySQL中的非严谨模式主要指的是关闭某些严格的数据校验机制,允许数据中存在一些不符合数据类型、长度、值域等规定的数据,比如日期字段中存储非日期格式的字符串。这样的修改能够让一些SQL查询等操作更快速地执行,更加灵活。但非严谨模式修改之后的影响也是非常明显的。
1.数据完整性受到破坏
在非严谨模式下,MySQL将不再对数据的完整性进行强制限制,导致了存储了非法数据的风险,并可能导致在应用程序上的错误。此外,还会导致数据类型和范围上的错误,导致对数据库的查询和分析出现问题。
2. 安全性风险增加
在一些情况下,非严谨模式可能会允许一些不受信的数据被存储在数据库中,增加了系统被入侵的可能性。比如:在密码字段存储了非密码数据,或者存在别名表的情况下即允许单个表中存在多个字段类型名称相同的字段。
3. 历史兼容性问题
非严谨模式的修改可能会导致数据库中的字段类型不匹配,导致不兼容没有进行修改的旧应用程序,从而导致这些程序无法继续工作,甚至导致系统的崩溃。
以上就是MySQL非严格模式对数据库管理的重要影响的几个方面,但并不代表非严格模式就完全不需要。在实际应用中,它的使用能带来一些好处:一些小型的数据库系统或者内部工具可能需要快速地开发和测试,关闭一些校验机制可以提高工作效率,这样的场景可以开启非严格模式;也有某些特殊情况下需要存储一些手动调节的数据,取消某些特定字段的数据完整性限制是合理的。
当然,关闭MySQL的一些严格校验机制也需要谨慎,仅建议在特定的场景下使用。一些情况下软件的性能可能是最重要的,而在其他情况下确保数据完整性的保持非常关键。
举个例子,在大量数据需求下进行数据导入时,关闭一些约束可以显着提高导入速度。例如,禁用触发器和索引,可以加快数据的加载。
con = connect(MySQLdb.cursors.DictCursor)
con.autocommit = False
# Drop tables if they exist
con.execute(‘DROP TABLE IF EXISTS products’)
con.execute(‘DROP TABLE IF EXISTS categories’)
# Create tables
con.execute(‘CREATE TABLE categories(id INT PRIMARY KEY,
name VARCHAR(20), created_at DATETIME)’)
con.execute(‘CREATE TABLE products(id INT PRIMARY KEY,
category_id INT, name VARCHAR(20),
price DECIMAL(10,2), created_at DATETIME)’)
# insert categories
con.execute(‘INSERT INTO categories VALUES(0, “uncategorised”, NOW())’)
# Insert products
for i in xrange(1, 15000):
con.execute(‘INSERT INTO products VALUES(%s,%s,%s,%s,NOW())’,
(i, randint(0,12),
‘product number %s’% i,
randint(1,10000)/100.00))
con.commit()
无论我们是否关闭了约束来加速查询,我们都应该在查询完成后再重新启用它们。例如在之前的例子中执行以下语句可以创建新的索引:
con.execute(‘CREATE INDEX product_categories_id_index ON products(category_id)’)
结果
mysql> SELECT categories.name, COUNT(*)
-> FROM categories, products
-> WHERE products.category_id = categories.id
-> GROUP BY categories.name;
+——–+———-+
| name | COUNT(*) |
+——–+———-+
| Hard To Find | 411 |
| PCs | 1181 |
| Peripherals | 1150 |
| Software | 1188 |
| Storage | 1102 |
| Timepieces | 303 |
+——–+———-+
6 rows in set (0.79 sec)
总结:在数据导入大量的数据时,关闭严格校验机制,加速操作是非常有益的,但需要特别小心,避免出现异常的数据,而后带来不必要的后果。如果不清楚非严谨模式的影响,应该先在测试环境下开启该模式,以便为您提供必要的反馈。