- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章让MySQL数据库跑的更快 为数据减肥由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在数据库优化工作中,使数据尽可能的小,使表在硬盘上占据的空间尽可能的小,这是最常用、也是最有效的手段之一。因为缩小数据,相对来说可以提高硬盘的读写速度,并且在查询过程中小表的内容处理时所占用的系统资源比较少。同理,如果在比较小的列上设置索引的话,其索引所占用的资源也会比较少。那么数据库管理员该如何给自己的数据减肥呢?对此笔者有如下几个建议.
建议一:空值并不一定不占用空间 。
在这里笔者先给大家扫盲一下。有些数据库管理员,认为空值不会占用系统资源,其实这是一个错误的认识。他们在数据库设计时,不喜欢将字段的属性设置为NOT NULL。而让用户根据自己的需要来输入数据。笔者认为,这种做法对于数据库的性能是不利的.
笔者的意见是,如果有可能的话,尽量将列设置为NOT NULL,即不允许有空值。这么做的话,可以加快后续处理的速度,同时从数据存储来看还可以使得每列节省一位,从而达到数据减肥的目的。在实际工作中,如果有些情况不需要用户输入数据时,还可以通过默认字段来达到非空的目的。如在薪资系统中,可以将用户的工作年限默认设置为0,而不是空白。当然,如果确实需要NULL的话,也没有办法。但是作为数据库工程师来说,要尽量避免使用NULL值.
建议二:使用尽量小的数据类型 。
数据类型的大小也会影响到基础表的大小。如对于MEDIUMINT和INT两个数据类型,其都可以用来保存整数型的数据,只是其能够保存的精度不同而已。但是从存储数据的角度来看,前者所需要的存储空间要比后者节省25%左右。为此在能够使用MEDIUMINT的情况下,就不要使用INT.
另外在定义数据长度的时候,在满足需求的情况下,也要尽量的短。如现在薪资考核系统中有员工编码一个字段。如果企业员工编码已经确定,有五位字符构成。那么在定义字段时,只需要定义5个字符的长度。这不仅可以缩小存储空间,而且还可以起到一定的数据校对功能。当用户输入的编码长度超过5位时,数据将无法保存.
虽然说保存某个数据可以有很多数据类型可以选择,也可以定义比较大的字符位数。但是选择尽量小的数据类型,可以帮助降低数据存储空间,达到数据减肥的目的。从而进一步提升数据库的性能.
建议三:索引与数据表大小的关系 。
笔者在文章一开头就谈到过,如果对于比较小的列设置索引,那么索引也将占用比较少的资源。可见,索引与数据表大小也有紧密的联系。在合适的地方、合适的时机设置合适的索引,也可以实现对数据减肥的目的.
如通常情况下,每张数据表可能会有多个索引,但是主索引往往只有一个。为此对于每张表的主索引应该考虑尽量的短小精悍。这可以帮助数据库更快的进行识别.
再如尽量对前缀进行索引。如现在有一张表,需要对某个列设置索引。而这个列有一个特点,即在头几个字符上有唯一的前缀。如果存在这种情况的话,那么紧紧索引这个前缀,而不是全部,效果会更好。在MySQL数据库中,支持对一个字符列的最左边部分创建一个索引。这也就是说,数据库会将某个字段根据一定的规则拆分为前后两个部分。拆分后前面一部分的数据如果能够保持唯一,那么就只需要对前面一部分设置索引即可,而不需要对整个字段的数据设置索引。这无疑可以缩小索引所占用的资源,实现减肥的目的。更短的索引,能够提供更快的查询速度。因为它们所占用的硬盘空间更少,而且他们将在索引缓存中保存更多的访问。从而降低硬盘的搜索次数,提高查询的效率.
最后需要注意的就是,索引不能够滥用。使用索引确实可以提高数据的处理能力,但是索引同时也会带来额外的开销。只有这个收益大于开销时,使用索引才能够提升数据库的性能。否则的话,则会起到相反的效果。如某个表需要进行快速的存储,如果在这个表上设置过多的索引,索引就会起到副作用。对此笔者建议,如果主要通过搜索列的组合来存取一个表,那么最好对他们只设置一个索引。当然,这个索引部分应该是日常工作中最常用的列。在不得已的情况下,如果需要使用多个索引的话,那么最好能够以更多的副本使用列来获得更好的索引压缩。从而降低因为使用了多个索引而增加的资源消耗.
建议四:在需要“丰满”的地方还是不能够节省 。
一个女人,该瘦的地方要瘦,该丰满的地方要丰满。其实数据库也是如此。能够节省硬盘空间的地方,就要节省。而不能够节省的地方,则不能够为了减肥而将其精简下来。有时候这会起到适得其反的效果.
笔者以Varchar为例。如在MyISAM标中,如果没有任何可变长的列,那么最好使用固定大小的数据类型。虽然采用固定长度的数据类型,往往会浪费一定的存储空间。因为如果用户输入的数据不足,采用固定长度的话,数据存储时仍然会按这个固定的长度来存储。但是在这种情况下,能够用固定长度的,还是要使用固定长度。因为这种情况下虽然会浪费一定的硬盘空间,但是却可以提高数据的查询速度.
可见,并不是在任何情况下对数据减肥都可以提高数据库的性能。这就好像节支开源,这个节省要节省在刀刃上。否则的话,不但不能够节支,而且还会搬起石头砸自己的脚。通俗的说,就是该瘦的地方要瘦,该丰满的地方要丰满。记住这句话,就对了.
建议五:将表分割以实现减肥的目的 。
蚂蚁在搬食物时,如果某块食物过大,无法搬动的话,蚂蚁则可能会将这个块食物进行分割,直到其搬得动为止。这就是分蛋糕原理。其实这种现象在日常工作中经常常见。如我们有一张数据库表格,如果里面的纪录非常多,那么表格的允许速度会非常的慢。在这种情况下,可以根据一定的规则将表分为多个工作簿。如现在有一份企业员工的考勤信息。对这个表进行查询、排序、统计时,等待时间非常的长。此时就可以根据部门将其分割成不同的工作簿,然后再对其进行相关的数据分析。此时虽然工作量会大一点,但是其处理的速度会变快许多.
根据这个原理,在数据库优化时,可以将一个经常被扫描的大表分割为2个或者2个以上的表示非常有益的。如在日常工作中,笔者现在有一个动态格式的数据表,并且这个数据是使用一个扫描表时,就会用这个来找出相关行的比较小的静态格式的表.
通过这个表的拆分,可以将一块大蛋糕分为几块小的蛋糕,以利于后续数据的统计与分析。当然这个效果的好坏,直接跟这个拆分的规则有关。关于表如何拆分才能够达到理想的效果,这又是一个比较大的话题。由于这里篇幅有限,笔者不做过多的说明。或许在后续的文章中,笔者会以这命题进行展开,给大家做详细的说明.
原文出处:http://publish.itpub.net/a2011/0302/1161/000001161945.shtml 。
最后此篇关于让MySQL数据库跑的更快 为数据减肥的文章就讲到这里了,如果你想了解更多关于让MySQL数据库跑的更快 为数据减肥的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的问题是如何在 python 中创建一个简单的数据库。我的例子是: User = { 'Name' : {'Firstname', 'Lastname'}, 'Address' : {'Street
我需要创建一个与远程数据库链接的应用程序! mysql 是最好的解决方案吗? Sqlite 是唯一的本地解决方案吗? 我使用下面的方法,我想知道它是否是最好的方法! NSString *evento
给定两台 MySQL 服务器,一台本地,一台远程。两者都有一个包含表 bohica 的数据库 foobar。本地服务器定义了用户 'myadmin'@'%' 和 'myadmin'@'localhos
我有以下灵活的搜索查询 Select {vt:code},{vt:productcode},{vw:code},{vw:productcode} from {abcd AS vt JOIN wxyz
好吧,我的电脑开始运行有点缓慢,所以我重置了 Windows,保留了我的文件。因为我的大脑还没有打开,所以我忘记事先备份我的 MySQL 数据库。我仍然拥有所有原始文件,因此我实际上仍然拥有数据库,但
如何将我的 Access 数据库 (.accdb) 转换为 SQLite 数据库 (.sqlite)? 请,任何帮助将不胜感激。 最佳答案 1)如果要转换 db 的结构,则应使用任何 DB 建模工具:
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
系统检查发现了一些问题: 警告:?:(mysql.W002)未为数据库连接“默认”设置 MySQL 严格模式 提示:MySQL 的严格模式通过将警告升级为错误来修复 MySQL 中的许多数据完整性问题
我想在相同的 phonegap 应用程序中使用 android 数据库。 更多说明: 我创建了 phonegap 应用程序,但 phonegap 应用程序不支持服务,所以我们已经在 java 中为 a
Time Tracker function clock() { var mytime = new Date(); var seconds
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
我有一个可以收集和显示各种测量值的产品(不会详细介绍)。正如人们所期望的那样,显示部分是一个数据库+建立在其之上的网站(使用 Symfony)。 但是,我们可能还会创建一个 API 来向第三方公开数据
我们将 SQL Server 从 Azure VM 迁移到 Azure SQL 数据库。 Azure VM 为 DS2_V2、2 核、7GB RAM、最大 6400 IOPS Azure SQL 数据
我正在开发一个使用 MongoDB 数据库的程序,但我想问在通过 Java 执行 SQL 时是否可以使用内部数据库进行测试,例如 H2? 最佳答案 你可以尝试使用Testcontainers Test
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 已关闭 9 年前。 此问题似乎与 a specific programming problem, a sof
我正在尝试使用 MSI 身份验证(无需用户名和密码)从 Azure 机器学习服务连接 Azure SQL 数据库。 我正在尝试在 Azure 机器学习服务上建立机器学习模型,目的是我需要数据,这就是我
我在我的 MySQL 数据库中使用这个查询来查找 my_column 不为空的所有行: SELECT * FROM my_table WHERE my_column != ""; 不幸的是,许多行在
我有那个基地:http://sqlfiddle.com/#!2/e5a24/2这是 WordPress 默认模式的简写。我已经删除了该示例不需要的字段。 如您所见,我的结果是“类别 1”的两倍。我喜欢
我有一张这样的 table : mysql> select * from users; +--------+----------+------------+-----------+ | userid
我有表: CREATE TABLE IF NOT EXISTS `category` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL
我是一名优秀的程序员,十分优秀!