MYSQL数据量过亿了,如何提高查询效率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MYSQL数据量过亿了,如何提高查询效率相关的知识,希望对你有一定的参考价值。

mysql数据量过10亿了,而且需要多维度查询,请问有什么方案可以提高查询效率。索引就不用谈了。数据归档的方法不适合目前的需求。我目前的考虑的把每次第1次查询的结果存入memcache里,理论上效率可以提高N倍,但是这种办法还没实践过,而且按照不同条件的存入到memcache的话,memcache会不会因为数据量太大而崩溃。。 还望高人请教。
目前只有5个积分了。不好意思。

参考技术A 不进行结构优化的话只能用缓存了

讲结果缓存进 memcache ,并记录缓存 hits 和 时间,每次先检查是否在memcache 里,在的话直接返回
不在的话就去数据库查询,然后看memcache是否满了,不满就添加到memcache里。否则就不添加。

另外运行一个守护进程,对缓存时间过长并且hits 很低的记录删除掉,清除memcache空间。本回答被提问者采纳
参考技术B 水平分表,分百表,一表1000万条记录,如何?

如何提高mysql的安全性

一 作为最流行的开源数据库引擎,MySQL本身是非常安全的。即便如此,你仍然需要添加额外的安全层来保护你的MySQL数据库不受攻击,毕竟任何经营网上
在线业务的人都不想冒数据库受到损坏的风险。接下来,我们将介绍一些实用的办法,你可以利用这些办法来保护MySQL数据库,以便加强网站的安全性。

二 保护操作系统

确保操作系统的安全是保护数据库安全的前提,因为如果整个运行环境不安全,那么网站上所有的东西都脆弱,很容易暴露于攻击者。为了维护操作系统和MySQL服务器,你可以使用以下方法:

2.1 主机数据库服务器和web服务器分别在不同的物理机器上,如果可能,在一个单独的服务器上运行数据库服务器,以预防由其他应用程序或服务的漏洞造成的服务器问题。

安装杀毒软件,防火墙以及所有推荐的补丁和更新,防火墙能有效地把流量过滤到MySQL服务器。为了更好的提高安全性,你还可以实行入口封锁。

禁用所有不必要的服务,而且这样的服务越少越好。

2.2 保护所有帐户和密码

攻击者侵入MySQL数据库最常见的一种方法是窃取有安全隐患的账户信息。为了降低出现这种风险的可能性,你不妨试一试下面的方法:

2.2.1. 给所有MySQL账户设置密码

客户程序并不是每次都能识别用户,因此,如果用户知道数据库名但是没有这个用户名的密码,那他可以指定任何其他用户名连接到MySQL数据库。让每个MySQL用户名都设置密码,这样一来,要想利用匿名账户建立连接将会变得很困难。

2.2.2. 不要使用根用户运行MySQL服务器

在安装MySQL的时候,默认情况下创建了一个命名为“root”的管理用户。每个人都知道这一点,所以攻击者通常试图侵入这个“root”用户来获取访问权限。为了保障这个重要帐户的安全,你需要给它重新命名,然后更改一个长并且复杂的密码。

2.2.3你可以在MySQL控制台使用mysql> RENAME USER root TO new_username;
指令给根用户重命名,使用mysql> SET PASSWORD FOR 'username'@'%hostname' =
PASSWORD('newpassword');//这是很重要的一条命令

指令来修改密码。

三. 减少管理员账户

管理员账户越多,风险越大,所以你应该保持尽可能最少的帐户数量,只有为那些真正需要它的人创建账户。此外,记得要删除未使用的和匿名的账户。如果你有很多管理员账户,那你需要定期检查并清理那些不必要的账户。

四. 加强所有的密码

除了管理员帐户,你还需要加强所有其他用户的密码。你可以检查所有的用户名和密码,必要的时候你还可以重置安全强度低的账户密码。虽说这样做会有点费时,但却是有必要的。

五 限制数据库权限

每个用户都应该被授予适当的权限以便数据库能够正常运行,但这样一来也加大了数据库的安全隐患。就数据库权限而言,我们有以下几点建议:

5.1. 不要授予非管理员用户文件/高级/程序权限

文件,高级和程序权限都不应该被滥用。文件权限让用户可以在文件系统中的任何一个地方编写文件,而程序权限让用户在任何时候都能够查看服务器活动,终止客户端连接甚至更改服务器操作。为了你的数据库安全,这些权限只能授予给管理员账户。

5.2. 限制或禁用显示数据库权限

显示数据库特权可以用于收集数据库信息,所以攻击者通常利用它来窃取数据并准备进一步攻击。你应该把这个权限授予那些真正需要的人,或者直接禁用这个权
限,你只需要把skip-show-database添加到MySQL数据库中的/etc/my.cnf配置文件中。对于Windows操作系统来说,则
需要添加到my.ini文件中。

5.3. 限制管理员和所有其他用户的权限

即使是管理员,也不要在同一账户中授予所有权限。因此我们建议你最好降低管理员账户访问数据的权限。至于其他的用户,你最好检查所有他们拥有的权限,以确保一切都是合适的。

六 删除风险组件

MySQL数据库的默认配置有一些不必要的组件,你可以考虑以下建议:

6.1. 禁用LOAD DATA LOCAL INFILE指令

这个命令允许用户读取本地文件甚至访问其他操作系统上的文件,这可能帮助攻击者收集重要的信息并利用应用程序的漏洞侵入你的数据库。你需要做的是把set-variable=local-infile=0插入到MySQL数据库的my.cnf文件中,来禁用这个指令。

6.2. 删除测试数据库

有一个默认的“测试”数据库用于测试目的。由于这个数据库有安全风险,匿名用户也可以访问,你应该使用mysql> DROP database test;指令尽快把它清除掉。

6.3. 删除历史文件

MySQL服务器有一个历史文件,它可以帮助你在安装出错的时候找到问题所在。历史文件包含敏感信息,比如说密码,如果这些信息被攻击者获得,那么将会给
你的数据库带来巨大的安全隐患。在安装成功后,历史文件并没有什么用,因此你可以使用cat /dev/null >
~/.mysql_history指令来删除文件当中的内容。

七 限制远程访问MySQL服务器

对于大多数用户来说,不需要通过不安全的开放网络来访问MySQL服务器。你可以通过配置防火墙或硬件,或者迫使MySQL只听从localhost来限制主机。此外,需要SSH隧道才能进行远程访问。

八 如果你想仅仅从本地主机来限制用户建立连接,你需要在在配置文件中添加bind-address=127.0.0.1。

8.1利用日志记录

启用日志记录让你可以检测服务器上的活动,这样你就可以分析失败的登录尝试和敏感文件的访问记录,以便了解是否存在向你的服务器和数据库发起的恶意活动。
你只需要把log =/var/log/mylogfile指令添加到MySQL配置文件中,就可以手动启用日志记录功能。

8.2至于日志记录,需要注意以下两点:

8.2.1日志记录仅适用于查询数量有限的数据库服务器。对于信息量大的服务器,这可能会导致高过载。

8.2.2由于“hostname.err”文件包含敏感数据表名和密码,只有“root”和“mysql”才有访问和记录这个文件的权限。
参考技术A

你可以这样操作。

    如果MYSQL客户端和服务器端的连接需要跨越并通过不可信任的网络,那么需要使用ssh隧道来加密该连接的通信。

    使用set password语句来修改用户的密码,先“mysql -u root”登陆数据库系统,然后“mysql> update mysql.user set password=password(‘newpwd’)”,最后执行“flush privileges”就可以了。

    Mysql需要提防的攻击有,防偷听、篡改、回放、拒绝服务等,不涉及可用性和容错方面。对所有的连接、查询、其他操作使用基于acl即访问控制列表的安全措施来完成。也有一些对ssl连接的支持。

    设置除了root用户外的其他任何用户不允许访问mysql主数据库中的user表;加密后存放在user表中的加密后的用户密码一旦泄露,其他人可以随意用该用户名/密码相应的数据库;

    使用grant和revoke语句来进行用户访问控制的工作;

    不要使用明文密码,而是使用md5()和sha1()等单向的哈系函数来设置密码;

    不要选用字典中的字来做密码;

    采用防火墙可以去掉50%的外部危险,让数据库系统躲在防火墙后面工作,或放置在dmz区域中;

    从因特网上用nmap来扫描3306端口,也可用telnet server_host 3306的方法测试,不允许从非信任网络中访问数据库服务器的3306号tcp端口,需要在防火墙或路由器上做设定;

    为了防止被恶意传入非法参数,例如where id=234,别人却输入where id=234 or 1=1导致全部显示,所以在web的表单中使用”或”"来用字符串,在动态url中加入%22代表双引号、%23代表井号、%27代表单引号;传递未检查过的值给mysql数据库是非常危险的;

    在传递数据给mysql时检查一下大小;

    应用程序需要连接到数据库应该使用一般的用户帐号,开放少数必要的权限给该用户;

    在各编程接口(c c++ php perl java jdbc等)中使用特定‘逃脱字符’函数;在因特网上使用mysql数据库时一定少用传输明文的数据,而用ssl和ssh的加密方式数据来传输;

    学会使用tcpdump和strings工具来查看传输数据的安全性,例如tcpdump -l -i eth0 -w -src or dst port 3306 strings。以普通用户来启动mysql数据库服务;

    不使用到表的联结符号,选用的参数 –skip-symbolic-links;

    确信在mysql目录中只有启动数据库服务的用户才可以对文件有读和写的权限;

    不许将process或super权限付给非管理用户,该mysqladmin processlist可以列举出当前执行的查询文本;super权限可用于切断客户端连接、改变服务器运行参数状态、控制拷贝复制数据库的服务器;

    file权限不付给管理员以外的用户,防止出现load data ‘/etc/passwd’到表中再用select 显示出来的问题;

    如果不相信dns服务公司的服务,可以在主机名称允许表中只设置ip数字地址;

    使用max_user_connections变量来使mysqld服务进程,对一个指定帐户限定连接数;

    grant语句也支持资源控制选项;

    启动mysqld服务进程的安全选项开关,–local-infile=0或1 若是0则客户端程序就无法使用local load data了,赋权的一个例子grant insert(user) on mysql.user to ‘user_name’@'host_name’;若使用–skip-grant-tables系统将对任何用户的访问不做任何访问控制,但可以用 mysqladmin flush-privileges或mysqladmin reload来开启访问控制;默认情况是show databases语句对所有用户开放,可以用–skip-show-databases来关闭掉。

    碰到error 1045(28000) access denied for user ‘root’@'localhost’ (using password:no)错误时,你需要重新设置密码,具体方法是:先用–skip-grant-tables参数启动mysqld,然后执行 mysql -u root mysql,mysql>update user set password=password(‘newpassword’) where user=’root’;mysql>flush privileges;,最后重新启动mysql就可以了。

参考技术B 其实这个和jsp没啥关系,只要你的代码没有比如爆源码或者直接上传shell这些弱智的漏洞就行了,一般的做法其实很简单,就是给mysql分配一个单独的账号,而不要使用root权限,而且只能针对目标数据库操作,其他的数据库没有操作权限,如果要附加上jsp的话,那么就是别让你的程序出现注入之类的漏洞,因为只要存在注入,那么至少可以肯定你的数据库会全部泄露,这样会使别人进一步入侵你甚至控制你的服务器,当然了linux和windows的服务器还是有差别的,上面给你说的只是最一般的方法本回答被提问者和网友采纳

以上是关于MYSQL数据量过亿了,如何提高查询效率的主要内容,如果未能解决你的问题,请参考以下文章

如何使用mysql api关闭ssl模式提高查询效率

MySQL如何实现分库分表,如何提高查询效率

MySQL单表数据量过千万

MySQL单表数据量过千万,采坑优化记录,完美解决方案

MySQL Insert数据量过大导致报错 MySQL server has gone away

sql查询未走索引问题分析之查询数据量过大