分类目录归档:MySQL

MySQL自带的帮助文档

利用好MySQL自带的帮助文档,可以快捷的解决些问题(不必大动作的在MySQL官方网上查询):比如,当前版本是否支持某个功能,哪些函数;某个字段类型的取值范围;甚至忘了某个操作语法。以下举例说明下。

1) 按层次看帮助。

比如,显示所有可供查询的分类:

mysql> ? contents

这里列出的分类,又可以按“? 类别名称”对其内容进一步的查看。比如,支持哪些数据类型:

mysql> ? data types

在这列出的类型中,又可以进一步查看具体类型的具体介绍。比如:

mysql> ? char

以上看出,可以通过“? 类别名称”有层次性查找自己所有关心的主题内容。

2) 按关键字看帮助

mysql> ? show  // 可以列出show命令能查看什么

mysql> ? create table   // 可以查看create table的具体语法

 

MySQL使用索引的情况

索引是数据库优化很常见和重要的手段之一。 复习下在MySQL数据库中索引的使用情况。

一 使用的情况:

1)在复合索引中(即多列组成的索引),最左边的列才被使用索引。 比如order(order_id, user_id, user_name)中,为 (user_id, user_name)列创建索引,当按user_id查询SELECT * FROM order WHERE user_id = 2011,此时WHERE条件不是用的user_id和user_name复合索引,索引仍然会被使用,这也是索引的前缀特性。 但如果按user_name进行查询,索引则不可用。

2)在LIKE查询中,后边如果是常量且%不在首字符,索引才被使用。 如: 索引字段 LIKE ‘2011%’(索引被使用),但 LIKE ‘%2011’(索引不被使用)。

3)‘索引字段 is NULL’ 的情况将使用索引。

4) MEMORY/HEAP表的查询使用‘=’的条件下索引才起作用。

二 不使用的情况:

1)复合索引中,使用不是第一列的其它列进行查询时,不使用索引。

2) 使用索引比全表扫描更慢时不用索引。 比如 ‘id > 1 OR id < 10’(id是索引字段)。

3) MEMORY/HEAP表WHERE条件不使用‘=’进行索引列。

4) 在OR条件中,OR前的列是索引列,OR后的列不是索引列,那么索引列无效。

5)LIKE条件中%在第一位,不使用索引。

6)索引列如果是字符类型,对字符常量查询如果无引号,索引无效。比如 SELECT * FROM order WHERE user_name = 2011(user_name是索引列),此时查询有效,但索引无效(进行全表扫描)。 user_name=’2011’则索引被使用。

另外,我们通过SHOW STATUS命令了解各个SQL的执行频率(show status like ‘Handler_read%’查看索引的使用情况),EXPLAIN分析各个SQL执行计划,这涉及优化方面,再探讨。

简单的MySQL数据库安全策略

1)操作系统。在其OS(操作系统)上创建某一用户来专门运行MySQL,这样可以对此用户的权限加以限制来提高安全性。试想,如果在运行类似UNIX的OS,以root用户的身份运行MySQL服务器,这样可能赋予了一个MySQL普通用户读写OS任何地方的文件的权限。防止非管理员用户访问WEB服务器中的mysqladmin程序。另外,把MySQL服务器建立在Firewall(防火墙)后(这样可终止未授权主机的连接)或改变其默认端口,都可进一步提高其安全性。

2)密码。这是大家都比较熟悉的。务必为所有用户设置复杂的密码。如果需要在脚本文件保存密码(如db_connect.php),必须小心把此文件保存在WEB文档树结构以外,并且只能由特定的用户进行访问。

3)用户权限。利用MySQL权限系统,为每个用户配置其所配对的权限(即必须的,最少的,例如类型表只授予SELECT权限,订单表中只授予INSERT权限等),如果不是绝对需要,不要将GRANT,PROCESS,FILE,SHUTDOWN和RELOAD等权限授予任何非管理员的用户。建立用户时,其连接主机的权限也得加以确认,应该避免在主机名中使用通配符,还有在host表中使用IP地址而不是域名(这样可以在DNS位置避免错误问题)。

4)WEB问题。务必过滤来自用户的所有数据。