首页> 搜索结果页
"sql数据库碎片整理" 检索
共 135 条结果
SQL Serever学习16——索引,触发器,数据库维护
  sqlserver2014数据库应用技术 《清华大学出版社》  索引 这是一个很重要的概念,我们知道数据在计算机中其实是分页存储的,就像是单词存在字典中一样 数据库索引可以帮助我们快速定位数据在哪个存储页区,而不用扫描整个数据库 索引一旦被创建就会数据库自动管理和维护,增删改插座数据库都会对索引做修改 索引分类: 聚集索引 非聚集索引 包含性列索引 索引视图 全文索引 xml索引 聚集索引,就是相当于排序的字典(将表中的数据完全重新排序),一个表只有一个,所占空间相当于表中数据的120%,数据建立聚集索引,会改变数据行的存储物理结构 非聚集索引,不改变数据行的物理存储结构,CREATE INDEX默认建立非聚集索引,理论一个表可以有249个非聚集索引 索引和约束 设置主键,会自动创建PRIMARY KEY 和创建一个聚集索引 创建UNIQUE 约束会自动创建一个唯一非聚集索引 创建表的索引   使用SQL语句 CREATE INDEX IX_name_mj ON 买家表(买家名称) GO      查看索引 EXEC sp_helpindex 买家表 分析索引 查看查询计划,使用的索引(优先使用聚集索引) SET SHOWPLAN_ALL ON GO SELECT * FROM 买家表 GO SET SHOWPLAN_ALL OFF GO 显示统计信息,查看所花费的磁盘io活动量 SET STATISTICS IO ON GO SELECT * FROM 买家表 GO SET STATISTICS IO OFF GO    维护索引 数据表的增删改操作会产生大量索引碎片,索引表不连续,降低索引性能,需要整理索引 查看索引碎片SQL DBCC SHOWCONTIG(买家表,PK_买家表) GO    ssms查看索引 索引碎片整理 DBCC INDEXDEFRAG(销售管理,买家表,PK_买家表)    触发器 触发器是一个高级的数据约束,他是特殊的存储过程,不能通过执行sql触发,由增删改等事件自动触发 sqlserver2014提供3种触发器: DML触发器,包括事后触发器,替代触发器,CLR运行时触发器 DDL触发器,修改表结构触发 LOGIN触发器,登录的时候触发 DML触发器 INSERT触发器 如果员工年龄不到18岁不执行插入操作 CREATE TRIGGER Employee_Insert ON Employee AFTER INSERT AS BEGIN --从INSERTED表获取新插入员工的出生年月 DECLARE @birthday date SELECT @birthday=birthday FROM inserted --判断新员工年龄 IF(YEAR(GETDATE())-YEAR(@birthday)<18) BEGIN PRINT '该员工年龄不到18岁,不能入职!' ROLLBACK TRANSACTION --回滚这个节点之前的所有操作,然后继续执行后面的语句 END END 验证 INSERT Employee VALUES('小明','2012-10-10') 再验证 INSERT Employee VALUES('小明','1912-10-10') 注意主键id仍然会增长,即使刚刚的操作回滚了,id还是增加了1  UPDATE触发器 防止用户修改员工姓名name字段   CREATE TRIGGER Employee_Update ON Employee AFTER UPDATE AS BEGIN IF(UPDATE(NAME)) BEGIN PRINT '禁止修改员工姓名!' ROLLBACK TRANSACTION --回滚这个节点之前的所有操作,然后继续执行后面的语句 END END 验证 UPDATE Employee SET NAME='XX'     数据库的维护 备份 使用存储过程创建备份设备 EXEC sp_addumpdevice 'DISK','COMB','E"\DATA\COMB.BAK'   删除备份设备 EXEC sp_dropdevice 'COMB'   使用SQL创建数据库备份 BACKUP DATABASE 销售管理 TO COMB   使用SQL还原数据库 RESTORE DATABASE COMB FROM DISK='E:/DATA/COMB.BAK'  
文章
SQL · 存储 · Go · 数据库 · 索引 · 数据格式 · XML · .NET · 开发框架
2018-08-30
《转》SQL Server 2008 数据维护实务
SQL Server 2008 数据维护实务 http://blog.csdn.net/os005/article/details/7739553 http://www.cnblogs.com/xunziji/archive/2011/04/01/2002396.html   感觉蛮有用的,以前不清楚的地方, 都可以串起来了, 特别是重建索引和重新组织索引的区别。 还有邮件通知操作员的配置,正在学习。 ~~~~~~~~~~~~~~~~~~~~~~~~~~   最近试用了下 Sql Server 2008 的    Maintenance Plans( 维护计划 ),感觉很不错很不错。一贯的延续了微软的风格,图形化界面操作,保准你掌握了这个,就能成为半个DBA了,哈哈,吹牛了,就是想说这个蛮不错的,特别是比这 Sql Server 2000 和 Sql Server 2005 来说,用户体验又好了一些。   废话不多说了,下面就开始详细介绍 Maintenance Plans( 维护计划 ) :   官方对维护计划,即  Maintenance Plans 的解释:维护计划向导可以用于帮助您设置核心维护任务,从而确保数据库执行良好,做到定期备份数据库以防系统出现故障,对数据库实施不一致性检查。维护计划向导可创建一个或多个 SQL Server 代理作业,代理作业将按照计划的间隔自动执行这些维护任务。它使您可以执行各种数据库管理任务,包括备份、运行数据库完整性检查、或以指定的间隔更新数据库统计信息。创建数据库维护计划可以让SQL Server有效地自动维护数据库,保持数据库运行在最佳状态,并为管理员节省了宝贵的时间。   其实用一句话来说,Maintenance Plans( 维护计划 ) 就是来帮你方便的管理和优化数据库。   其内部,仍然是封装了部分 T-Sql 语句和 job   Maintenance Plans( 维护计划 )主要能做的工作为:   1. 备份数据库(Back Up Database) 2. 更新统计信息(Update Statistics) 3. 检查数据库完整性(Check Database Integrity) 4. 清除历史记录(History Cleanup) 5. 清除维护(Maintenance Cleanup) 6. 收缩数据库(Shrink Database) 7. 通知操作员(Notify Operator) 8. 执行 Sql Server 代理作业(Execute SQL Server Agent Job) 9. 执行 T-SQL 语句(Execute T-SQL Statement) 10. 重新生成索引(Rebuild Index Task) 11. 重新组织索引(Reorganize Index)     1. 备份数据库(Back Up Database) 最常用,也是最重要的功能了,是用起来也很见很简单,直接从左边拖拽过来 之后,在“备份数据库任务” 上右键编辑或者直接双击红色的图标,进行详细配置,详细配置信息如下图所示: 大致一看,就能明白大多配置的意思。其中有几个还是需要特殊说明一下的。 数据库:该选项选择备份Sql Server 实例中的那几个库,可以多选 备份集过期时间:是备份的失效时间,数值在 0 -99999之间,0 代表永不过气,此选项也是比较有用的,如果磁盘空间不足,新的备份文件就会覆盖掉过期的备份文件 跨一个或多个文件备份数据库:适合多文件组的数据库     2. 更新统计信息 更新 MicrosoftSQL Server 中对 表和索引的统计信息,此任务使用 UPDATE STATISTICS 语句。这个还是蛮有用的,主要影响 Sql Server 创建更好的查询计划。 上图标红的按钮,可以查看该任务封装的SQL语句     3. 检查数据库完整性(Check Database Integrity)   其实就是 DBCC CHECKDB 的 T-Sql  的封装,没什么好说的。主要用来检查数据库的完整性,DBCC CHECKDB 及相关语句通常必须从磁盘将每个已分配的页读取到内存中,才能对其进行检查,所以极消耗性能,不建议在高峰期使用。 另外,鄙人一直找不到用 DBCC CHECKDB 这个语句的地方,可能还没有碰到相应的问题把,或者由于鄙人才疏学浅啦      4. 清除历史记录(History Cleanup)   使用“‘清除历史记录’任务”对话框,可以丢弃 msdb 数据库表中旧的历史信息。 此任务支持删除备份和还原历史记录、SQL Server 代理作业历史记录和维护计划历史记录。   其实个人观察,清除的应该是 日志里面的内容     5. 清除维护(Maintenance Cleanup) 这个功能很实用,绝对的实用,并且很简单,主要用来删除备份文件或其他文件,并且图形化界面,功能也很全面,有了这个功能,绝对不会再怕备份文件把磁盘占满了。 想当初,还写的是清除文件的bat,然后放到任务计划里面,现在想起来,那种操作真不犀利了,Sql Server 已经为我们考虑好了   详细配置看下图(主要包括:删除以下类型的文件、文件位置、文件保留时间):     6. 收缩数据库(Shrink Database) 这个功能鄙人不太常用,主要是用来减小数据库所占用的磁盘空间大小,下面就引用一段MSDN 的解释把: 使用“‘收缩数据库’任务”对话框可以创建一个任务,尝试减小所选数据库 的大小。使用下面的选项可以确定数据库收缩后在数据库中保留的未使用空间量(该百分比越大,数据库可收缩的量越小)。该数值取决于数据库中实际数据的百分 比。例如,某个 100 MB 数据库包含 60 MB 的数据和 40 MB 的可用空间,当可用空间百分比为 50% 时,则将保留 60 MB 的数据和 30 MB 的可用空间(因为 60 MB 的 50% 是 30 MB)。只会去除数据库中的多余空间。有效值为 0 到 100。 此任务执行 DBCC SHRINKDATABASE 语句。     7. 通知操作员(Notify Operator)   使用的也是比较少,不过随着数据库重要性的上升,这个任务的重要程度也会提升的 摘自MSDN:使用“‘通知操作员’任务”对话框可以向此维护计划中添加自动通知。若要使用此任务,必须启用数据库邮件并将 MSDB 正确配置为邮件主机数据库,而且还要具有一个带有有效电子邮件地址的 MicrosoftSQL Server 代理操作员。 此任务使用 sp_notify_operator 存储过程。     8. 执行 Sql Server 代理作业(Execute SQL Server Agent Job) 感觉比较鸡肋的功能,主要用来执行 job 的,不知道怎么用,还不如在 SQL Server Agent 里面设置 Job。     9. 执行 T-SQL 语句(Execute T-SQL Statement) 蛮有用的,设置也比较简单,超时时间最好设置下     10. 重新生成索引(Rebuild Index Task) 和 重新组织索引(Reorganize Index) 这两个比较重要,又比较常用,同时又有可比性,所以就放在一起说。其实,在维护中,一般只选择这两个中的其中一个,对于如何选择,则是表的大小和db请求压力等决定的。 重新生成索引比重新组织索引更彻底,更给力,但是对于在线DB来讲,影响也比较大.。下面是详细的解释: 无论何时对基础数据执行插入、更新或删除操作,SQL Server 数据库引擎都会自动维护索引。随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片)。当索引包含的页中的逻辑排序(基于键值)与数 据文件中的物理排序不匹配时,就存在碎片。碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢。 您可以通过重新组织索引或重新生成索引来修复索引碎片。对于基于分区方案生成的已分区索引,可以在完整索引或索引的单个分区上使用下列方法之一。 重新组织索引: 若要重新组织一个或多个索引,可以使用带 REORGANIZE 子句的 ALTER INDEX 语句。此语句可以替代 DBCC INDEXDEFRAG 语句。若要重新组织已分区索引的单个分区,可以使用 ALTER INDEX 的 PARTITION 子句。 重新组织索引是通过对叶页进行物理重新排序,使其与叶节点的逻辑顺序 (从左到右)相匹配,从而对表或视图的聚集索引和非聚集索引的叶级别进行碎片整理。使页有序可以提高索引扫描的性能。索引在分配给它的现有页内重新组织, 而不会分配新页。如果索引跨多个文件,将一次重新组织一个文件,不会在文件之间迁移页。 重新组织还会压缩索引页。如果还有可用的磁盘空间,将删除此压缩过程中生成的所有空页。压缩基于 sys.indexes 目录视图中的填充因子值。 重新组织进程使用最少的系统资源。而且,重新组织是自动联机执行的。该进程不持有长期阻塞锁,所以不会阻止运行查询或更新。 索引碎片不太多时,可以重新组织索引。请参阅上面的表,了解有关碎片的指导原则。不过,如果索引碎片非常多,重新生成索引则可以获得更好的结果。 大型对象数据类型压缩 重新组织索引时,除了重新组织一个或多个索引外,默认情况下还将压缩聚集索引或基础表中包含的大型对象数据类型 (LOB)。数据类型 image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max) 和 xml 都是大型对象数据类型。压缩此数据可以改善磁盘空间使用情况: 重新组织指定的聚集索引将压缩该聚集索引的叶级别(数据行)包含的所有 LOB 列。 重新组织非聚集索引将压缩该索引中属于非键(包含性)列的所有 LOB 列。 如果指定 ALL,将重新组织与指定的表或视图相关联的所有索引,并压缩与聚集索引、基础表或带有包含列的非聚集索引相关联的所有 LOB 列。 如果 LOB 列不存在,则忽略 LOB_COMPACTION 子句。 重新生成索引: 重新生成索引将删除该索引并创建一个新索引。此过程中将删除碎片,通过使用指定的或现有的填充因子设置压缩页来回收磁盘空间,并在连续页中对索引行重新排序(根据需要分配新页)。这样可以减少获取所请求数据所需的页读取数,从而提高磁盘性能。 可以使用下列方法重新生成聚集索引和非聚集索引: 带 REBUILD 子句的 ALTER INDEX。此语句将替换 DBCC DBREINDEX 语句。 带 DROP_EXISTING 子句的 CREATE INDEX。 每个方法执行的功能都相同,但如下表所示,也都各有优缺点需要考虑。 功能 ALTER INDEX REBUILD CREATE INDEX WITH DROP_EXISTING 可以通过添加或删除键列、更改列顺序或更改列排序顺序来更改索引定义。* 否 是** 可以设置或修改索引选项。 是 是 可以在单个事务中重新生成多个索引。 是 否 可以联机重新生成大部分索引类型,而不会阻止运行查询或更新。 是 是 已分区索引可以重新分区。 否 是 可以将索引移动到另一个文件组中。 否 是 需要额外的临时磁盘空间。 是 是 重新生成聚集索引的操作将重新生成相关的非聚集索引。 否 除非指定关键字 ALL。 否 除非更改索引定义。 可以重新生成强制 PRIMARY KEY 和 UNIQUE 约束的索引,而不用删除并重新创建这些约束。 是 是 可以重新生成单个索引分区。 是 否 * 通过在索引定义中指定 CLUSTERED,可以将非聚集索引转换成聚集索引类型。执行此操作时必须将 ONLINE 选项设置为 OFF。不管将 ONLINE 设置成什么,都不支持从聚集索引到非聚集索引的转换。 ** 如果通过使用相同的名称、列和排序顺序重新创建索引,则可以省略排序操作。重新生成操作将检查行是否在生成索引时进行了排序。 您也可以先使用 DROP INDEX 语句删除索引,然后使用一个单独的 CREATE INDEX 语句重新创建该索引,通过这种方式重新生成索引。将这些操作作为单独的语句执行有许多缺点,因此不推荐这样做。
文章
SQL · 数据库 · 索引
2016-05-16
sql server 表索引碎片处理
DBCC SHOWCONTIG (Transact-SQL) SQL Server 2005 其他版本 更新日期: 2007 年 9 月 15 日 显示指定的表或视图的数据和索引的碎片信息。 重要提示: 后续版本的 Microsoft SQL Server 将删除该功能。请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。请改用 sys.dm_db_index_physical_stats。 Transact-SQL 语法约定 语法     DBCC SHOWCONTIG [ (     { table_name | table_id | view_name | view_id }     [ , index_name | index_id ] ) ]     [ WITH         {          [ , [ ALL_INDEXES ] ]          [ , [ TABLERESULTS ] ]          [ , [ FAST ] ]          [ , [ ALL_LEVELS ] ]          [ NO_INFOMSGS ]          }     ] 参数 table_name | table_id | view_name | view_id 要检查碎片信息的表或视图。如果未指定,则检查当前数据库中的所有表和索引视图。若要获得表或视图 ID,请使用 OBJECT_ID 函数。 index_name | index_id 要检查其碎片信息的索引。如果未指定,则该语句将处理指定表或视图的基本索引。若要获取索引 ID,请使用 sys.indexes 目录视图。 WITH 指定有关 DBCC 语句返回的信息类型的选项。 FAST 指定是否要对索引执行快速扫描和输出最少信息。快速扫描不读取索引的叶级或数据级页。 ALL_INDEXES 显示指定表和视图的所有索引的结果,即使指定了特定索引也是如此。 TABLERESULTS 将结果显示为含附加信息的行集。 ALL_LEVELS 仅为保持向后兼容性而保留。即使指定了 ALL_LEVELS,也只对索引叶级或表数据级进行处理。 NO_INFOMSGS 取消严重级别从 0 到 10 的所有信息性消息。 结果集 下表对结果集中的信息进行了说明。 统计信息 说明 扫描页数 表或索引中的页数。 扫描区数 表或索引中的区数。 区切换次数 遍历表或索引的页时,DBCC 语句从一个区移动到另一个区的次数。 每个区的平均页数 页链中每个区的页数。 扫描密度 [最佳计数:实际计数] 百分比。这是“最佳计数”与“实际计数”的比率。如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片。 “最佳计数”是指在一切都连续链接的情况下,区更改的理想数目。“实际计数”是指区更改的实际次数。 逻辑扫描碎片 扫描索引的叶级页时返回的出错页的百分比。此数与堆无关。对于出错页,分配给索引的下一个物理页不是由当前叶级页中的“下一页”指针所指向的页。 区扫描碎片 扫描索引的叶级页时出错区所占的百分比。此数与堆无关。对于出错区,包含当前索引页的区在物理上不是包含上一个索引页的区的下一个区。 如果索引跨越多个文件,则此数字无意义。 注意: 每页的平均可用字节数 扫描的页上平均可用字节数。此数字越大,则页的填充程度越低。如果索引不会有很多随机插入,则数字越小越好。此数字还受行大小影响:行越大,此数字就越大。 平均密度(全部) 页的平均密度,以百分比表示。该值会考虑行大小。因此,该值可以更准确地指示页的填充程度。百分比越大越好。 如果指定了 table_id 和 FAST,则 DBCC SHOWCONTIG 将返回只包含以下列的结果集。 扫描页数 区切换次数 扫描密度 [最佳计数:实际计数] 区扫描碎片 逻辑扫描碎片 如果指定了 TABLERESULTS,则 DBCC SHOWCONTIG 将返回以下列以及上一个表中说明的九个列。 统计信息 说明 Object Name 处理的表或视图的名称。 ObjectId 对象名的 ID。 IndexName 处理的索引的名称。堆的 IndexName 为 NULL。 IndexId 索引的 ID。堆的 IndexId 为 0。 Level 索引的级别。级别 0 是索引的叶(或数据)级。 堆的级别为 0。 页 组成某个索引级别或整个堆的页数。 Rows 某个索引级别上的数据或索引记录数。对于堆,此值是整个堆中的数据记录数。 对于堆,此函数返回的记录数可能与对该堆运行 SELECT COUNT(*) 返回的行数不匹配。这是因为一行可以包含多条记录。例如,在某些更新的情况下,执行更新操作后单个堆行可能包含一条前推记录和一条被前推记录。另外,大多数大的 LOB 行在 LOB_DATA 存储区中都拆分为多条记录。 MinimumRecordSize 某个索引级别或整个堆中的最小记录大小。 MaximumRecordSize 某个索引级别或整个堆中的最大记录大小。 AverageRecordSize 某个索引级别或整个堆中的平均记录大小。 ForwardedRecords 该索引级别或整个堆中的被前推记录数。 区 某个索引级别或整个堆中的区数。 ExtentSwitches 遍历表或索引的页时,DBCC 语句从一个区移动到另一个区的次数。 AverageFreeBytes 扫描的页上平均可用字节数。此数字越大,则页的填充程度越低。如果索引不会有很多随机插入,则数字越小越好。此数字还受行大小影响:行越大,此数字就越大。 AveragePageDensity 页的平均密度,以百分比表示。该值会考虑行大小。因此,该值可以更准确地指示页的填充程度。百分比越大越好。 ScanDensity 百分比。这是“最佳计数”与“实际计数”的比率。如果所有内容都是连续的,则该值为 100;如果该值小于 100,则存在一些碎片。 BestCount 所有内容连续链接时的区更改理想数量。 ActualCount 区更改实际数量。 LogicalFragmentation 扫描索引的叶级页时返回的出错页的百分比。此数与堆无关。出错页是指分配给索引的下一个物理页不是由当前叶级页中的“下一页”指针所指向的页。 ExtentFragmentation 扫描索引的叶级页时出错区所占的百分比。此数与堆无关。对于出错区,包含当前索引页的区在物理上不是包含上一个索引页的区的下一个区。 如果索引跨越多个文件,则此数字无意义。 注意: 如果指定了 WITH TABLERESULTS 和 FAST,则结果集将与指定 WITH TABLERESULTS 时一样,但以下列的值将为 null: Rows 区 MinimumRecordSize AverageFreeBytes MaximumRecordSize AveragePageDensity AverageRecordSize ExtentFragmentation ForwardedRecords   备注 如果指定了 index_id,则 DBCC SHOWCONTIG 语句将遍历指定索引的叶级上的页链。如果只指定 table_id,或者 index_id 为 0,则将扫描指定表的数据页。该操作仅需要意向共享 (IS) 表锁。通过这种方式,除了需要排他 (X) 表锁的更新和插入以外,可执行所有更新和插入。这就可以根据返回的统计信息数量,实现执行速度与不减少并发之间进行权衡。但是,如果使用此命令只是为了测量碎片,则建议您使用 WITH FAST 选项以优化性能。快速扫描不读取索引的叶级或数据级页。WITH FAST 选项不适用于堆。 SQL Server 2005 中的更改 SQL Server 2005 中计算碎片的算法比 SQL Server 2000 中的算法更精确。因此,碎片值显得更高。例如,在 SQL Server 2000 中,如果一个表的第 11 页和第 13 页在同一区中,而第 12 页不在该区中,则不会将该表视为存在碎片。但是访问这些页需要两次物理 I/O 操作,因此,在 SQL Server 2005 中,将把这种情况算作碎片。 DBCC SHOWCONTIG 不显示数据类型为 ntext、text 和 image 的数据。这是因为 SQL Server 2005 中不再有存储文本和图像数据的文本索引(SQL Server 2000 中的索引 ID 为 255)。有关索引 ID 255 的详细信息,请参阅 sys.sysindexes (Transact-SQL)。 此外,DBCC SHOWCONTIG 也不支持 SQL Server 2005 中的某些新功能。例如: 如果指定的表或索引已分区,则 DBCC SHOWCONTIG 只显示指定表或索引的第一个分区。 DBCC SHOWCONTIG 不显示行溢出存储信息和其他新的行外数据类型,如 nvarchar(max)、varchar(max)、varbinary(max) 和 xml。 SQL Server 2005 中的所有新功能完全由 sys.dm_db_index_physical_stats 动态管理视图支持。 表碎片 DBCC SHOWCONTIG 可确定表是否高度碎片化。在对表进行数据修改(INSERT、UPDATE 和 DELETE 语句)的过程中会出现表碎片现象。由于这些修改通常并不在表的行中平均分布,所以每页的填满状态会随时间而改变。对于扫描部分或全部表的查询,这样的表碎片会导致读取额外的页。从而延缓了数据的并行扫描。 如果索引的碎片非常多,可选择以下方法来减少碎片: 删除然后重新创建聚集索引。 重新创建聚集索引将重新组织数据,从而使数据页填满。填充度可以使用 CREATE INDEX 中的 FILLFACTOR 选项进行配置。这种方法的缺点是索引在删除/重新创建周期内为脱机状态,并且该操作是一个整体,不可中断。如果中断索引创建,则不能重新创建索引。 对索引的叶级页按逻辑顺序重新排序。 使用 ALTER INDEX…REORGANIZE,对索引的页级页按逻辑顺序重新排序。由于此操作是联机操作,因此语句运行时索引可用。此外,中断该操作不会丢失已完成的工作。这种方法的缺点是在重新组织数据方面没有聚集索引的删除/重新创建操作有效。 重新生成索引。 使用 REBUILD 和 ALTER INDEX 重新生成索引。有关详细信息,请参阅 ALTER INDEX (Transact-SQL)。 结果集中的 Avg. Bytes free per page 和 Avg. Page density (full) 统计信息指示索引页的填充度。对于不应具有很多随机插入的索引,Avg. Bytes free per page 数应较低,Avg. Page density (full) 数应较高。使用指定的 FILLFACTOR 选项删除并重建索引可改善统计信息。另外,REORGANIZE 和 ALTER INDEX 可根据其 FILLFACTOR 选项压缩索引,从而改善统计信息。 注意: 如果索引有很多随机插入和很满的页,则其页拆分数将增加。这将导致更多的碎片。 索引的碎片级别可通过以下方式确定: 比较“区切换次数”和“扫描区数”的值。 “区切换次数”的值应尽可能接近于“扫描区数”的值。此比率将作为“扫描密度”值计算。此值应尽可能的大,可通过减少索引碎片得到改善。 注意: 如果索引涉及多个文件,则此方法无效。 了解“逻辑扫描碎片”和“区扫描碎片”的值。 “逻辑扫描碎片”和“区扫描碎片”(对于较小的区)的值是表的碎片级别的最好指标。这两个值应尽可能接近零,但 0% 到 10% 的值都是可接受的。 注意: 如果索引涉及多个文件,则“区扫描碎片”的值将较高。若要减小这些值,必须减少索引碎片。 权限 用户必须是表所有者,或者是 sysadmin 固定服务器角色、db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。 示例 A. 显示表的碎片信息 以下示例将显示 Employee 表的碎片信息。     USE AdventureWorks; GO DBCC SHOWCONTIG ("HumanResources.Employee"); GO B. 使用 OBJECT_ID 获得表 ID,使用 sys.indexes 获得索引 ID 以下示例使用 OBJECT_ID 和 sys.indexes 目录视图,以获取 AdventureWorks 数据库中 Production.Product 表的 AK_Product_Name 索引的表 ID 和索引 ID。     USE AdventureWorks; GO DECLARE @id int, @indid int SET @id = OBJECT_ID('Production.Product') SELECT @indid = index_id FROM sys.indexes WHERE object_id = @id AND name = 'AK_Product_Name' DBCC SHOWCONTIG (@id, @indid); GO C. 显示表的简略结果集 以下示例将返回 AdventureWorks 数据库中 Product 表的简略结果集。     USE AdventureWorks; GO DBCC SHOWCONTIG ("Production.Product", 1) WITH FAST; GO D. 显示数据库中每个表的每个索引的完整结果集 以下示例将显示 AdventureWorks 数据库中每个表的每个索引的完整表结果集。     USE AdventureWorks; GO DBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXES; GO E. 使用 DBCC SHOWCONTIG 和 DBCC INDEXDEFRAG 对数据库中的索引进行碎片整理 以下示例将展示一种简单的方法,对数据库中碎片数量在声明的阈值之上的所有索引进行碎片整理。     /*Perform a 'USE <database name>' to select the database in which to run the script.*/ -- Declare variables SET NOCOUNT ON; DECLARE @tablename varchar(255); DECLARE @execstr varchar(400); DECLARE @objectid int; DECLARE @indexid int; DECLARE @frag decimal; DECLARE @maxfrag decimal; -- Decide on the maximum fragmentation to allow for. SELECT @maxfrag = 30.0; -- Declare a cursor. DECLARE tables CURSOR FOR SELECT TABLE_SCHEMA + '.' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'; -- Create the table. CREATE TABLE #fraglist ( ObjectName char(255), ObjectId int, IndexName char(255), IndexId int, Lvl int, CountPages int, CountRows int, MinRecSize int, MaxRecSize int, AvgRecSize int, ForRecCount int, Extents int, ExtentSwitches int, AvgFreeBytes int, AvgPageDensity int, ScanDensity decimal, BestCount int, ActualCount int, LogicalFrag decimal, ExtentFrag decimal); -- Open the cursor. OPEN tables; -- Loop through all the tables in the database. FETCH NEXT FROM tables INTO @tablename; WHILE @@FETCH_STATUS = 0 BEGIN; -- Do the showcontig of all indexes of the table INSERT INTO #fraglist EXEC ('DBCC SHOWCONTIG (''' + @tablename + ''') WITH FAST, TABLERESULTS, ALL_INDEXES, NO_INFOMSGS'); FETCH NEXT FROM tables INTO @tablename; END; -- Close and deallocate the cursor. CLOSE tables; DEALLOCATE tables; -- Declare the cursor for the list of indexes to be defragged. DECLARE indexes CURSOR FOR SELECT ObjectName, ObjectId, IndexId, LogicalFrag FROM #fraglist WHERE LogicalFrag >= @maxfrag AND INDEXPROPERTY (ObjectId, IndexName, 'IndexDepth') > 0; -- Open the cursor. OPEN indexes; -- Loop through the indexes. FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag; WHILE @@FETCH_STATUS = 0 BEGIN; PRINT 'Executing DBCC INDEXDEFRAG (0, ' + RTRIM(@tablename) + ', ' + RTRIM(@indexid) + ') - fragmentation currently ' + RTRIM(CONVERT(varchar(15),@frag)) + '%'; SELECT @execstr = 'DBCC INDEXDEFRAG (0, ' + RTRIM(@objectid) + ', ' + RTRIM(@indexid) + ')'; EXEC (@execstr); FETCH NEXT FROM indexes INTO @tablename, @objectid, @indexid, @frag; END; -- Close and deallocate the cursor. CLOSE indexes; DEALLOCATE indexes; -- Delete the temporary table. DROP TABLE #fraglist; GO
文章
SQL · 存储 · Go · 数据库 · 索引 · 算法 · 数据格式 · XML
2017-06-20
Oracle数据库日常维护
在Oracle数据库运行期间,DBA应该对数据库的运行日志及表空间的使用情况进行监控,及早发现数据库中存在的问题。 一、Oracle警告日志文件监控 Oracle在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的一些运行情况: l 数据库的启动、关闭,启动时的非缺省参数; l 数据库的重做日志切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行完成造成不能切换,会记录不能切换的原因; l 对数据库进行的某些操作,如创建或删除表空间、增加数据文件; l 数据库发生的错误,如表空间不够、出现坏块、数据库内部错误(ORA-600) DBA应该定期检查日志文件,根据日志中发现的问题及时进行处理 问题 处理 启动参数不对 检查初始化参数文件 因为检查点操作或归档操作没有完成造成重做日志不能切换 如果经常发生这样的情况,可以考虑增加重做日志文件组;想办法提高检查点或归档操作的效率; 有人未经授权删除了表空间 检查数据库的安全问题,是否密码太简单;如有必要,撤消某些用户的系统权限 出现坏块 检查是否是硬件问题(如磁盘本生有坏块),如果不是,检查是那个数据库对象出现了坏块,对这个对象进行重建 表空间不够 增加数据文件到相应的表空间 出现ORA-600 根据日志文件的内容查看相应的TRC文件,如果是Oracle的bug,要及时打上相应的补丁 二、数据库表空间使用情况监控(字典管理表空间) 数据库运行了一段时间后,由于不断的在表空间上创建和删除对象,会在表空间上产生大量的碎片,DBA应该及时了解表空间的碎片和可用空间情况,以决定是否要对碎片进行整理或为表空间增加数据文件。 select tablespace_name, count(*) chunks , max(bytes/1024/1024) max_chunk from dba_free_space group by tablespace_name; 上面的SQL列出了数据库中每个表空间的空闲块情况,如下所示: TABLESPACE_NAME CHUNKS MAX_CHUNK -------------------- ---------- ---------- INDX 1 57.9921875 RBS 3 490.992188 RMAN_TS 1 16.515625 SYSTEM 1 207.296875 TEMP 20 70.8046875 TOOLS 1 11.8359375 USERS 67 71.3671875 其中,CHUNKS列表示表空间中有多少可用的空闲块(每个空闲块是由一些连续的Oracle数据块组成),如果这样的空闲块过多,比如平均到每个数据文件上超过了100个,那么该表空间的碎片状况就比较严重了,可以尝试用以下的SQL命令进行表空间相邻碎片的接合: alter tablespace 表空间名 coalesce; 然后再执行查看表空间碎片的SQL语句,看表空间的碎片有没有减少。如果没有效果,并且表空间的碎片已经严重影响到了数据库的运行,则考虑对该表空间进行重建。 MAX_CHUNK列的结果是表空间上最大的可用块大小,如果该表空间上的对象所需分配的空间(NEXT值)大于可用块的大小的话,就会提示ORA-1652、ORA-1653、ORA-1654的错误信息,DBA应该及时对表空间的空间进行扩充,以避免这些错误发生。 对表空间的扩充对表空间的数据文件大小进行扩展,或向表空间增加数据文件,具体操作见“存储管理”部份。 三、查看数据库的连接情况 DBA要定时对数据库的连接情况进行检查,看与数据库建立的会话数目是不是正常,如果建立了过多的连接,会消耗数据库的资源。同时,对一些“挂死”的连接,可能会需要DBA手工进行清理。 以下的SQL语句列出当前数据库建立的会话情况: select sid,serial#,username,program,machine,status from v$session; 输出结果为: SID SERIAL# USERNAME PROGRAM MACHINE STATUS ---- ------- ---------- ----------- --------------- -------- 1 1 ORACLE.EXE WORK3 ACTIVE 2 1 ORACLE.EXE WORK3 ACTIVE 3 1 ORACLE.EXE WORK3 ACTIVE 4 1 ORACLE.EXE WORK3 ACTIVE 5 3 ORACLE.EXE WORK3 ACTIVE 6 1 ORACLE.EXE WORK3 ACTIVE 7 1 ORACLE.EXE WORK3 ACTIVE 8 27 SYS SQLPLUS.EXE WORKGROUP\WORK3 ACTIVE 11 5 DBSNMP dbsnmp.exe WORKGROUP\WORK3 INACTIVE 其中, SID 会话(session)的ID号; SERIAL# 会话的序列号,和SID一起用来唯一标识一个会话; USERNAME 建立该会话的用户名; PROGRAM 这个会话是用什么工具连接到数据库的; STATUS 当前这个会话的状态,ACTIVE表示会话正在执行某些任务,INACTIVE表示当前会话没有执行任何操作; 如果DBA要手工断开某个会话,则执行: alter system kill session 'SID,SERIAL#'; 注意,上例中SID为1到7(USERNAME列为空)的会话,是Oracle的后台进程,不要对这些会话进行任何操作。 四、控制文件的备份 在数据库结构发生变化时,如增加了表空间,增加了数据文件或重做日志文件这些操作,都会造成Oracle数据库控制文件的变化,DBA应及进行控制文件的备份,备份方法是: 执行SQL语句:alter database backup controlfile to '/home/backup/control.bak'; 或: alter database backup controlfile to trace; 这样,会在USER_DUMP_DEST(初始化参数文件中指定)目录下生成创建控制文件的SQL命令。 五、检查数据库文件的状态 DBA要及时查看数据库中数据文件的状态(如被误删除),根据实际情况决定如何进行处理,检查数据文件的状态的SQL如下: select file_name,status from dba_data_files; 如果数据文件的STATUS列不是AVAILABLE,那么就要采取相应的措施,如对该数据文件进行恢复操作,或重建该数据文件所在的表空间。 六、检查数据库定时作业的完成情况 如果数据库使用了Oracle的JOB来完成一些定时作业,要对这些JOB的运行情况进行检查: select job,log_user,last_date,failures from dba_jobs; 如果FAILURES列是一个大于0的数的话,说明JOB运行失败,要进一步的检查。 七、数据库坏块的处理 当Oracle数据库出现坏块时,Oracle会在警告日志文件(alert_SID.log)中记录坏块的信息: ORA-01578: ORACLE data block corrupted (file # 7, block # <BLOCK>) ORA-01110: data file <AFN>: '/oracle1/oradata/V920/oradata/V816/users01.dbf' 其中,<AFN>代表坏块所在数据文件的绝对文件号,<BLOCK>代表坏块是数据文件上的第几个数据块 出现这种情况时,应该首先检查是否是硬件及操作系统上的故障导致Oracle数据库出现坏块。在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。 1.确定发生坏块的数据库对象 SELECT tablespace_name,segment_type,owner,segment_name FROM dba_extentsWHERE file_id = <AFN> AND <BLOCK> between block_id AND block_id+blocks-1; 2.决定修复方法 如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建; 如果发生坏块的表的记录可以根据其它表的记录生成的话,那么可以直接把这个表DROP掉后重建; 如果有数据库的备份,则恢复数据库的方法来进行修复; 如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据块上的记录取出来,然后对这个表进行重建。 3.用Oracle提供的DBMS_REPAIR包标记出坏块 exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('<schema>','<tablename>'); 4.使用Create table as select命令将表中其它块上的记录保存到另一张表上 create table corrupt_table_bak as select * from corrupt_table; 5.用DROP TABLE命令删除有坏块的表 drop table corrupt_table; 6.用alter table rename命令恢复原来的表 alter table corrupt_table_bak rename to corrupt_table; 7.如果表上存在索引,则要重建表上的索引 八、操作系统相关维护 DBA要注意对操作系统的监控: l 文件系统的空间使用情况(df -k),必要时对Oracle的警告日志及TRC文件进行清理 l 如果Oracle提供网络服务,检查网络连接是否正常 l 检查操作系统的资源使用情况是否正常 l 检查数据库服务器有没有硬件故障,如磁盘、内存报错 本文转自高海东博客园博客,原文链接:http://www.cnblogs.com/ghd258/archive/2006/02/25/337488.html,如需转载请自行联系原作者
文章
SQL · 监控 · 关系型数据库 · 数据库 · 索引 · Oracle · 数据库管理 · 数据安全/隐私保护 · 存储
2017-11-26
SQL Server 2008 R2学习心得
最近有幸参加了SQL Server2008 R2的学习,有几点自己感觉比较实用的知识点以及技巧,和大家分享一下。 1,备份时勾选checksum选项。 数据库备份时偶尔会产生损坏页,而且在访问到损坏页之前往往不容易被我们发现。因此备份后首先应该记得做的一件事就是验证一下,在早期版本的SQL Server中我们可以用如下命令进行检测:   dbcc checkdb 数据库名 在SQL server2005以后的版本中备份为我们提供了checksum选项,备份时同时进行检测,保证数据的正确性和完整性。 2.时间类型 提到时间类型,我们常用的就是datetime类型,当计算时间间隔的时候有两种常用方法: ①采用>=datetime1 and <= datetime2+' 24:00:00',这种方式问题倒是不太大; ②采用 convert(datetime1)方式转换为日期,然后进行比较。这种方式的弊端在于会导致索引无效。解决方案是采用计算列,即,添加一个列为convert(colname),然后在新列上建索引。这样就可以避免修改程序来挽回索引了。 在SQL Server2008中,为了解决这些问题,有了更细的时间类型:date、time、datetime2(精度更高)、datetimeoffset(带时区)。 3.其他备份选项:  ①备份压缩:在备份的同时对数据进行压缩,当数据量较大的时候可以为企业节省服务器资源。  ②碎片处理:对于数据库页进行碎片整理,提高性能。  ③索引视图:一般的视图中是没有数据的,是一张虚表。但是索引视图中是包含数据的,这样可以提高检索性能,当然也会浪费了部分空间。是典型的以空间换时间做法。 4.稀疏列:当列为变长类型时null值不消耗空间,当为定长类型时null值消耗空间。这种做法实际上抛弃了范式规则,来提高读取速度。不过一般建议当该列null值大于70%时才定义为稀疏列,否则所占据的空间反而更大。 5.页压缩、行压缩 SQL Server2008提供了压缩功能来节省空间,其中行压缩针对定长数据,页压缩包括行压缩,且重复值只存一次,其他的只存物理指针。 6.DAC 主要用来生成脚本,优点是可以包含表之间的依赖关系、结构信息等,但是不包括实际数据。 7.在虚拟机上架构SQL Server要记得打开Named Pipes协议。否则不能正常运行。 8.文件组: 建立数据库数据表之后将文件进行分组、规划。一般企业经常将整个数据库放在一个文件中,这是不合理的。或者有些企业建立多个数据库来分开管理,但是当服务器做镜像或者迁移时会存在建立索引的麻烦。所以建议使用文件组管理。 9.开发人员规范  ①写INSERT以及SELECT 要写明具体字段名称,否则一旦表字段进行了调整,就会带来修改客户端程序的麻烦。  ②存储过程名称不要以sp_开头,而要以usp_开头。因为sp_开头的存储过程会被当做系统自带内容,降低性能。     本文转自 陈敬(Cathy) 博客园博客,原文链接:http://www.cnblogs.com/janes/archive/2010/12/06/1897722.html,如需转载请自行联系原作者
文章
SQL · 数据库 · 索引 · 存储
2017-11-09
常用SQL语句大全
前言: 日常工作或学习过程中,我们可能会经常用到某些SQL,建议大家多多整理记录下这些常用的SQL,这样后续用到会方便很多。笔者在工作及学习过程中也整理了下个人常用的SQL,现在分享给你!可能有些SQL你还不常用,但还是希望对你有所帮助,说不定某日有需求就可以用到。 注:下文分享的SQL适用于MySQL 5.7 版本,低版本可能稍许不同。有些SQL可能执行需要较高权限。 1.show相关语句 ​ 查看实例参数 例如: show variables like '%innodb%'; show global variables like '%innodb%'; 查看实例状态,例如: show status like 'uptime%'; show global status like 'connection%'; 查看数据库链接: show processlist; show full processlist; 查询某个表的结构: show create table tb_name; 查询某个表的详细字段信息: show full columns from tb_name; 查询某个表的全部索引信息: show index from tb_name; 查询某个库以cd开头的表: show tables like 'cd%'; 查询某个库中的所有视图: show table status where comment='view'; 查询某个用户的权限: show grants for 'test_user'@'%'; ​ 2.查看账户相关信息 # 这里先介绍下CONCAT函数:在MySQL中 CONCAT()函数用于将多个字符串连接成一个字符串, 利用此函数我们可以将原来一步无法得到的sql拼接出来,后面部分语句有用到该函数。 当拼接字符串中出现''时 需使用转义符 查看所有用户名: SELECT DISTINCT CONCAT( 'User: '', user, ''@'', host, '';' ) AS QUERY FROM mysql.user; 查看用户详细信息: SELECT user, host, authentication_string, password_expired, password_lifetime, password_last_changed, account_locked FROM mysql.user; 3.KILL数据库链接 # 下面列举SQL只是拼接出kill 链接的语句,若想执行 直接将结果复制执行即可。 杀掉空闲时间大于2000s的链接: SELECT concat( 'KILL ', id, ';' ) FROM information_schema.`PROCESSLIST` WHERE Command = 'Sleep' AND TIME > 2000; 杀掉处于某状态的链接: SELECT concat( 'KILL ', id, ';' ) FROM information_schema.`PROCESSLIST` WHERE STATE LIKE 'Creating sort index'; 杀掉某个用户的链接: SELECT concat( 'KILL ', id, ';' ) FROM information_schema.`PROCESSLIST` WHERE where user='root'; 4.拼接创建数据库或用户语句 ​ 下面列举SQL只是拼接出kill 链接的语句,若想执行 直接将结果复制执行即可。 杀掉空闲时间大于2000s的链接: SELECT concat( 'KILL ', id, ';' ) FROM information_schema.`PROCESSLIST` WHERE Command = 'Sleep' AND TIME > 2000; 杀掉处于某状态的链接: SELECT concat( 'KILL ', id, ';' ) FROM information_schema.`PROCESSLIST` WHERE STATE LIKE 'Creating sort index'; 杀掉某个用户的链接: SELECT concat( 'KILL ', id, ';' ) FROM information_schema.`PROCESSLIST` WHERE where user='root'; ​ 5.查看库或表大小 # 查看整个实例占用空间大小: SELECT concat( round( sum( data_length / 1024 / 1024 ), 2 ), 'MB' ) AS data_length_MB, concat( round( sum( index_length / 1024 / 1024 ), 2 ), 'MB' ) AS index_length_MB FROM information_schema.`TABLES`; 查看各个库占用大小: SELECT TABLE_SCHEMA, concat( TRUNCATE ( sum( data_length )/ 1024 / 1024, 2 ), ' MB' ) AS data_size, concat( TRUNCATE ( sum( index_length )/ 1024 / 1024, 2 ), 'MB' ) AS index_size FROM information_schema.`TABLES` GROUP BY TABLE_SCHEMA; 查看单个库占用空间大小: SELECT concat( round( sum( data_length / 1024 / 1024 ), 2 ), 'MB' ) AS data_length_MB, concat( round( sum( index_length / 1024 / 1024 ), 2 ), 'MB' ) AS index_length_MB FROM information_schema.`TABLES` WHERE table_schema = 'test_db'; 查看单个表占用空间大小: SELECT concat( round( sum( data_length / 1024 / 1024 ), 2 ), 'MB' ) AS data_length_MB, concat( round( sum( index_length / 1024 / 1024 ), 2 ), 'MB' ) AS index_length_MB FROM information_schema.`TABLES` WHERE table_schema = 'test_db' AND table_name = 'tbname'; 6.查看表碎片及收缩语句 # 查看某个库下所有表的碎片情况: SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.TABLE_ROWS, concat( round( t.DATA_LENGTH / 1024 / 1024, 2 ), 'M' ) AS size, t.INDEX_LENGTH, concat( round( t.DATA_FREE / 1024 / 1024, 2 ), 'M' ) AS datafree FROM information_schema.`TABLES` t WHERE t.TABLE_SCHEMA = 'test_db' ORDER BY datafree DESC; 收缩表,减少碎片: alter table tb_name engine = innodb; optimize table tb_name; 7.查找无主键表 ​ 查看某个库下所有表的碎片情况: SELECT t.TABLE_SCHEMA, t.TABLE_NAME, t.TABLE_ROWS, concat( round( t.DATA_LENGTH / 1024 / 1024, 2 ), 'M' ) AS size, t.INDEX_LENGTH, concat( round( t.DATA_FREE / 1024 / 1024, 2 ), 'M' ) AS datafree FROM information_schema.`TABLES` t WHERE t.TABLE_SCHEMA = 'test_db' ORDER BY datafree DESC; 收缩表,减少碎片: alter table tb_name engine = innodb; optimize table tb_name; ​ 总结: 希望这些SQL语句能对你有所帮助,可以收藏一下,说不定某次就用到了呢! 云服务器ECS地址:阿里云·云小站
文章
SQL · 弹性计算 · 关系型数据库 · MySQL · 数据库 · 索引
2020-10-02
MYSQL常用的命令
create database name; 创建数据库  use databasename; 选择数据库  drop database name 直接删除数据库,不提醒  show tables; 显示表  describe tablename; 表的详细描述  UPDATE `tablename` SET `列名`='新字段' WHERE (`列名`='旧字段');  更改列中某个字段 select 中加上distinct去除重复字段  mysqladmin drop databasename 删除数据库前,有提示。  查看MYSQL数据库中所有用户: select distinct concat('User:''',user,'''@''',host,''':')as query from mysql.user; 删除用户:Delete from user where user='用户名' and host='IP';              flush privileges; 显示当前mysql版本和当前日期 :select version(),current_date;  2、修改mysql中root的密码:  shell>mysql -u root -p mysql> update user set password=password(”xueok654123″) where user=’root’;  mysql> flush privileges //刷新数据库  mysql>use dbname; 打开数据库:  mysql>show databases; 显示所有数据库  mysql>show tables; 显示数据库mysql中所有的表:先use mysql;然后  mysql>describe user; 显示表mysql数据库中user表的列信息);  3、grant  创建一个可以从任何地方连接服务器的一个完全的超级用户,但是必须使用一个口令something做这个  mysql> grant all privileges on *.* to identified by ’something’ with  增加新用户  格式:grant select on 数据库.* to 用户名@登录主机 identified by “密码” GRANT ALL PRIVILEGES ON *.* TO 用户名@登陆主机 IDENTIFIED BY ’密码’ ;  撤销用户某数据库授权: mysql> revoke all privileges on *.* from 用户名@登陆主机 identified by '密码';  mysql> delete from user where user=”root” and host=”%”;  mysql> flush privileges;  创建一个用户custom在特定客户端it363.com登录,可访问特定数据库fangchandb  mysql >grant select, insert, update, delete, create,drop on fangchandb.* to custom@ it363.com identified by ‘ passwd’  重命名表:  mysql > alter table t1 rename t2;  4、mysqldump  备份数据库 shell> mysqldump -h host -u root -p dbname >dbname_backup.sql  恢复数据库 shell> mysqladmin -h myhost -u root -p create dbname  shell> mysqldump -h host -u root -p dbname < dbname_backup.sql  如果只想卸出建表指令,则命令如下:  shell> mysqladmin -u root -p -d databasename > a.sql  如果只想卸出插入数据的sql命令,而不需要建表命令,则命令如下:  shell> mysqladmin -u root -p -t databasename > a.sql  那么如果我只想要数据,而不想要什么sql命令时,应该如何操作呢?  mysqldump -T./ phptest driver  其中,只有指定了-T参数才可以卸出纯文本文件,表示卸出数据的目录,./表示当前目录,即与mysqldump同一目录。如果不指定driver 表,则将卸出整个数据库的数据。每个表会生成两个文件,一个为.sql文件,包含建表执行。另一个为.txt文件,只包含数据,且没有sql指令。  5、可将查询存储在一个文件中并告诉mysql从文件中读取查询而不是等待键盘输入。可利用外壳程序键入重定向实用程序来完成这项工作。例如,如果在文件my_file.sql 中存放有查  询,可如下执行这些查询:  例如,如果您想将建表语句提前写在sql.txt中:  mysql > mysql -h myhost -u root -p database < sql.txt     启动:net start mySql;  进入:mysql -u root -p/mysql -h localhost -u root -p databaseName;  列出数据库:show databases;  选择数据库:use databaseName;  列出表格:show tables;  显示表格列的属性:show columns from tableName;  建立数据库:source fileName.txt;  匹配字符:可以用通配符_代表任何一个字符,%代表任何字符串;  增加一个字段:alter table tabelName add column fieldName dateType;  增加多个字段:alter table tabelName add column fieldName1 dateType,add columns fieldName2 dateType;  多行命令输入:注意不能将单词断开;当插入或更改数据时,不能将字段的字符串展开到多行里,否则硬回车将被储存到数据中;  增加一个管理员帐户:grant all on *.* to user@localhost identified by "password";  每条语句输入完毕后要在末尾填加分号';',或者填加'\g'也可以;  查询时间:select now();  查询当前用户:select user();  查询数据库版本:select version();   查询当前使用的数据库:select database();      1、删除student_course数据库中的students数据表:  rm -f student_course/students.*    2、备份数据库:(将数据库test备份)  mysqldump -u root -p test>c:\test.txt  备份表格:(备份test数据库下的mytable表格)  mysqldump -u root -p test mytable>c:\test.txt  将备份数据导入到数据库:(导回test数据库)  mysql -u root -p test<c:\test.txt    3、创建临时表:(建立临时表zengchao)  create temporary table zengchao(name varchar(10));    4、创建表是先判断表是否存在  create table if not exists students(……);    5、从已经有的表中复制表的结构  create table table2 select * from table1 where 1<>1;    6、复制表  create table table2 select * from table1;    7、对表重新命名  alter table table1 rename as table2;    8、修改列的类型  alter table table1 modify id int unsigned;//修改列id的类型为int unsigned  alter table table1 change id sid int unsigned;//修改列id的名字为sid,而且把属性修改为int unsigned    9、创建索引  alter table table1 add index ind_id (id);  create index ind_id on table1 (id);  create unique index ind_id on table1 (id);//建立唯一性索引    10、删除索引  drop index idx_id on table1;  alter table table1 drop index ind_id;    11、联合字符或者多个列(将列id与":"和列name和"="连接)  select concat(id,':',name,'=') from students;    12、limit(选出10到20条)<第一个记录集的编号是0>  select * from students order by id limit 9,10;    13、MySQL不支持的功能  事务,视图,外键和引用完整性,存储过程和触发器      14、MySQL会使用索引的操作符号  <,<=,>=,>,=,between,in,不带%或者_开头的like    15、使用索引的缺点  1)减慢增删改数据的速度;  2)占用磁盘空间;  3)增加查询优化器的负担;  当查询优化器生成执行计划时,会考虑索引,太多的索引会给查询优化器增加工作量,导致无法选择最优的查询方案;    16、分析索引效率  方法:在一般的SQL语句前加上explain;  分析结果的含义:  1)table:表名;  2)type:连接的类型,(ALL/Range/Ref)。其中ref是最理想的;  3)possible_keys:查询可以利用的索引名;  4)key:实际使用的索引;  5)key_len:索引中被使用部分的长度(字节);  6)ref:显示列名字或者"const"(不明白什么意思);  7)rows:显示MySQL认为在找到正确结果之前必须扫描的行数;  8)extra:MySQL的建议;    17、使用较短的定长列  1)尽可能使用较短的数据类型;  2)尽可能使用定长数据类型;  a)用char代替varchar,固定长度的数据处理比变长的快些;  b)对于频繁修改的表,磁盘容易形成碎片,从而影响数据库的整体性能;  c)万一出现数据表崩溃,使用固定长度数据行的表更容易重新构造。使用固定长度的数据行,每个记录的开始位置都是固定记录长度的倍数,可以很容易被检测到,但是使用可变长度的数据行就不一定了;  d)对于MyISAM类型的数据表,虽然转换成固定长度的数据列可以提高性能,但是占据的空间也大;    18、使用not null和enum  尽量将列定义为not null,这样可使数据的出来更快,所需的空间更少,而且在查询时,MySQL不需要检查是否存在特例,即null值,从而优化查询;  如果一列只含有有限数目的特定值,如性别,是否有效或者入学年份等,在这种情况下应该考虑将其转换为enum列的值,MySQL处理的更快,因为所有的enum值在系统内都是以标识数值来表示的;    19、使用optimize table  对于经常修改的表,容易产生碎片,使在查询数据库时必须读取更多的磁盘块,降低查询性能。具有可变长的表都存在磁盘碎片问题,这个问题对blob数据类型更为突出,因为其尺寸变化非常大。可以通过使用optimize table来整理碎片,保证数据库性能不下降,优化那些受碎片影响的数据表。 optimize table可以用于MyISAM和BDB类型的数据表。实际上任何碎片整理方法都是用mysqldump来转存数据表,然后使用转存后的文件并重新建数据表;    20、使用procedure analyse()  可以使用procedure analyse()显示最佳类型的建议,使用很简单,在select语句后面加上procedure analyse()就可以了;例如:  select * from students procedure analyse();  select * from students procedure analyse(16,256);  第二条语句要求procedure analyse()不要建议含有多于16个值,或者含有多于256字节的enum类型,如果没有限制,输出可能会很长;    21、使用查询缓存  1)查询缓存的工作方式:  第一次执行某条select语句时,服务器记住该查询的文本内容和查询结果,存储在缓存中,下次碰到这个语句时,直接从缓存中返回结果;当更新数据表后,该数据表的任何缓存查询都变成无效的,并且会被丢弃。  2)配置缓存参数:  变量:query_cache _type,查询缓存的操作模式。有3中模式,0:不缓存;1:缓存查询,除非与select sql_no_cache开头;2:根据需要只缓存那些以select sql_cache开头的查询;query_cache_size:设置查询缓存的最大结果集的大小,比这个值大的不会被缓存。    22、调整硬件  1)在机器上装更多的内存;  2)增加更快的硬盘以减少I/O等待时间;  寻道时间是决定性能的主要因素,逐字地移动磁头是最慢的,一旦磁头定位,从磁道读则很快;  3)在不同的物理硬盘设备上重新分配磁盘活动;   如果可能,应将最繁忙的数据库存放在不同的物理设备上,这跟使用同一物理设备的不同分区是不同的,因为它们将争用相同的物理资源(磁头)。   本文转自:http://www.cnblogs.com/wenanry/archive/2010/05/21/1740756.html 本文转自奔跑在路上博客51CTO博客,原文链接http://blog.51cto.com/qiangsh/1622176如需转载请自行联系原作者 qianghong000
文章
SQL · 关系型数据库 · 数据库 · 索引 · MySQL · 缓存 · 数据安全/隐私保护 · 存储 · 数据处理
2017-11-21
MySQL数据库优化大全方法汇总
随着数据和负载增加,MySQL数据库会日渐缓慢,性能越来越差,用户体验也随之变差,所以数据库性能优化十分紧迫,本文分享MySQL数据库优化大全: MySQL数据库优化 本文先模拟一下数据库访问流程,然后逐步的优化这些环节,可以从减少数据访问(减少磁盘访问)、返回更少数据(减少网络传输或磁盘访问)、减少交互次数(减少网络传输)、减少服务器CPU开销(减少CPU及内存开销)和利用更多资源(增加资源)几个方面来提升数据库性能。 可以从以下及方面优化MySQL数据库: 一:数据库结构优化 1)范式优化:表的设计合理化(符合3NF),比如消除冗余(节省空间); 2)反范式优化:比如适当加冗余等(减少join) 3)拆分表:分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法,可按月自动建表分区。 二:优化SQL语句 1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描; 2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3)很多时候用exists代替in是一个好的选择; 4)用Where子句替换HAVING子句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤; 5)迅速的定位执行速度慢的语句、开启慢查询、设置慢查询时间、启用慢查询日志、通过mysqldumoslow工具对慢日志进行分类汇总; 6)析SQL语句,通过explain分析查询、通profiling可以得到更详细的信息; 7)创建索引(主键索引/唯一索引/全文索引/普通索引); 8)避免Select * (不查询多余的列与行); 9)使用视图(经常被查询的列数据,并且这些数据不被经常的修改,删除); 三:分表技术(水平分割、垂直分割)、分区技术 如果遇到大表的情况下,SQL语句优化已经无法继续优化了,我们可以考虑分表和分区,目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。 分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。 1)都能提高mysql的性能,在高并发状态下都有一个良好的表现; 2)分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式,访问量不大,但是表数据很多的表,我们可以采取分区的方式等; 3)分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系; 4)表分区相对于分表,操作方便,不需要创建子表。 四:读写分离 MySQL读写分离可以参考:阿里云MySQL读写分离详解,本文来说说抛开阿里云来实现读写分离的方法: 方法一:php程序上自己做逻辑判断,写php代码的时候,自己在程序上做逻辑判读写匹配。select,insert、update、delete做正则匹配,根据结果选择写服务器(主服务器)。如果是select操作则选择读服务器(从服务器器) mysql_connect('读写的区分') 方法二:MySQL中间件,基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现。所以说主从复制是读写分离的基础。 五:存储过程 [模块化编程,可以提高速度] 存储过程是SQL语句和控制语句的预编译集合,保存在数据库中,可有应用程序调用执行,而且允许用户声明变量、逻辑控制语句及其他强大的编程功能。包含逻辑控制语句和数据操作语句,可以接收参数、输出参数、返回单个或多个结果值及返回值。 使用存储过程的优点:模块化程序设计,只需创建一次,以后即可调用该存储过程任意次;执行速度快,效率高;减少网络流量;具有良好的安全性。 六:对mysql配置优化 [配置最大并发数, 调整缓存大小] MySQL数据库优化大全方法汇总 七:MySQL服务器硬件升级 MySQL服务器硬件升级本文就不多赘述了,也可以使用云数据库,参考:阿里云MySQL云服务器详解 八:定时的去清除不需要的数据,定时进行碎片整理 1)查看表碎片的方法 select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from TABLES where TABLE_SCHEMA='test_db' and TABLE_NAME='table_name' limit 1; 2)Innodb存储引擎清理碎片方法: ALTER TABLE tablename ENGINE=InnoDB 3)Myisam存储引擎清理碎片方法: OPTIMIZE TABLE table_name 注意:MySQL碎片整理尽量选择业务不繁忙时清理,一个月清理一次即可。
文章
存储 · SQL · 缓存 · 关系型数据库 · MySQL · 中间件 · PHP · 数据库 · UED · 索引
2020-04-23
【译】一些优化你的SQL语句的TIPs
简介     对于写出实现功能的SQL语句和既能实现功能又能保证性能的SQL语句的差别是巨大的。很多时候开发人员仅仅是把精力放在实现所需的功能上,而忽略了其所写代码的性能和对SQL Server实例所产生的影响(也就是IO,CPU,内存方面的消耗).这甚至有可能使整个SQL Server实例跪了。本文旨在提供一些简单的步骤来帮助你优化SQL语句。     市面上已经有很多关于如何优化SQL Server性能的书籍和白皮书。所以本文并不打算达到那种深度和广度,而仅仅是为开发人员提供一个快速检测的列表来找到SQL语句中导致瓶颈产生的部分。     在开始解决性能问题之前,合适的诊断工具是必须的。除去众所周知的SSMS和SQL Profiler,SQL Server 2008还带有众多DMV来提供关键信息。本篇文章中,我将使用SSMS和一些DMV来找到SQL的瓶颈   那么,我们从哪开始     我的第一步是查看执行计划。这一步既可以通过SMSS也可以通过SQL Profiler实现,为了简便起见,我将在SMSS中获取执行计划。     1) 检查你是否忽略掉了某些表的连接的条件,从而导致了笛卡尔积(Cross)连接(Join)。比如,在生产系统中有两个表,每个表中有1000行数据。这其中绝大多数数据并不需要返回,如果你在这两个表上应用了Cross Join,返回的结果将会是100万行的结果集!返回如此数量的数据包括将所有数据从物理存储介质中读取出来,因而占用了IO。然后这些数据将会被导入内存,也就是SQL Server的缓冲区。这会将缓冲区内的其它页Flush出去。       2)查看你是否忽略了某些Where子句,缺少Where子句会导致返回额外不需要的行。这产生的影响和步骤一所产生的影响是一样的。       3)查看统计信息是否是自动创建和自动更新的,你可以在数据库的属性里看到这些选项     1     在默认条件下创建一个新数据库,Auto Create Statistics和Auto Update Statistics选项是开启的,统计信息是用于帮助查询优化器生成最佳执行计划的。这份白皮书对于解释统计信息的重要性以及对于执行计划的作用解释的非常到位。上面那些设置可以通过右键数据库,选择属性,在“选项”中找到。       4)检查统计信息是否已经过期,虽然统计信息是自动创建的,但是更新统计信息从而反映出数据的变化也同样重要。在一个大表中,有时候虽然Auto Update Statistics 选项已经开始,但统计信息依然无法反映出数据的分布情况。默认情况下,统计信息的更新是基于抽取表中的随机信息作为样本产生的。如果数据是按顺序存储的,那么很有可能数据样本并没有反映出表中的数据情况。因此,推荐在频繁更新的表中,统计信息使用Full Scan选项来定期更新。这种更新可以放到数据库闲时来做。      DBCC SHOW_STATISTICS命令可以用于查看上次统计信息的更新时间,行数以及样本行数.在这个例子中,我们可以看到Person.Address表上的AK_Address_rowguid索引的有关信息: USE AdventureWorks; GO DBCC SHOW_STATISTICS ("Person.Address", AK_Address_rowguid); GO     下面是输出结果,请注意Updated,Rows,Rows Sampled这三个列 2       如果你认为统计信息已经过期,则可以使用sp_updatestats这个存储过程来更新当前数据库中的所有统计信息: Exec sp_updatestats     或者使用FULLSCAN选项,则关于表Person.Address上的所有统计信息将会被更新: UPDATE STATISTICS Person.Address WITH FULLSCAN       5)查看执行计划是否出现任何表或者索引的扫描(译者注:不是查找),在大多数情况下(这里假设统计信息是最新的),这意味着索引的缺失。下面几个DMV对于查找缺失索引很有帮助: i) sys.dm_db_missing_index_details ii) sys.dm_db_missing_index_group_stats iii) sys.dm_db_missing_index_groups     接下来的几个语句使用了上面的DMV,按照索引缺失对于性能的影响,展现出信息: SELECT avg_total_user_cost,avg_user_impact,user_seeks, user_scans, ID.equality_columns,ID.inequality_columns,ID.included_columns,ID.statement  FROM sys.dm_db_missing_index_group_stats GS LEFT OUTER JOIN sys.dm_db_missing_index_groups IG On (IG.index_group_handle = GS.group_handle) LEFT OUTER JOIN sys.dm_db_missing_index_details ID On (ID.index_handle = IG.index_handle) ORDER BY avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)DESC    你也可以使用数据引擎优化顾问来找出缺失的索引以及需要创建哪些索引来提高性能。       6)查看是否有书签查找,同样,在执行计划中找到书签查找十分容易,书签查找并不能完全避免,但是使用覆盖索引可以大大减少书签查找。       7)查看排序操作,如果在执行计划中排序操作占去了很大一部分百分比,我会考虑以下几种方案:      按照所排序的列创建聚集索引,但这种方式一直存在争议。因为最佳实践是使用唯一列或者Int类型的列作为主键,然后让SQL Server在主键上创建聚集索引。但是在特定情况下使用排序列创建聚集索引也是可以的     创建一个索引视图,在索引视图上按照排序列创建聚集索引     创建一个排序列的非聚集索引,把其他需要返回的列INCLUDE进去       在我的另一篇文章中,我将会详细阐述选择最佳方案的方法。       8)查看加在表上的锁,如果所查的表由于一个DML语句导致上锁,则查询引擎需要花一些时间等待锁的释放。下面是一些解决锁问题的方法:     让事务尽可能的短     查看数据库隔离等级,降低隔离等级以增加并发     在Select语句中使用表提示,比如READUNCOMMITTED 或 READPAST.虽然这两个表提示都会增加并发,但是ReadUnCommited可能会带来脏读的问题,而READPAST会只返回部分结果集       9)查看是否有索引碎片,索引碎片可以使用sys.dm_db_index_physical_statsDMV轻松查看,如果索引碎片已经大于30%,则推荐索引重建.而索引碎片小于30%时,推荐使用索引整理。索引碎片因为使查询需要读取更多的列从而增加了IO,而更多的页意味着占用更多的缓冲区,因此还会形成内存压力。     如下语句根据索引碎片的百分比查看所有索引: Declare @db SysName; Set @db = '<DB NAME>'; SELECT CAST(OBJECT_NAME(S.Object_ID, DB_ID(@db)) AS VARCHAR(20)) AS 'Table Name',  CAST(index_type_desc AS VARCHAR(20)) AS 'Index Type',  I.Name As 'Index Name',  avg_fragmentation_in_percent As 'Avg % Fragmentation',  record_count As 'RecordCount',  page_count As 'Pages Allocated',  avg_page_space_used_in_percent As 'Avg % Page Space Used' FROM sys.dm_db_index_physical_stats (DB_ID(@db),NULL,NULL,NULL,'DETAILED' ) S LEFT OUTER JOIN sys.indexes I On (I.Object_ID = S.Object_ID and I.Index_ID = S.Index_ID) AND S.INDEX_ID > 0 ORDER BY avg_fragmentation_in_percent DESC    下面语句可以重建指定表的所有索引: ALTER INDEX ALL ON <Table Name> REBUILD;     下面语句可以重建指定索引: ALTER INDEX <Index Name> ON <Table Name> REBUILD;     当然,我们也可以整理索引,下面语句整理指定表上的所有索引: ALTER INDEX ALL ON <Table Name> REORGANIZE;     下面语句指定特定的索引进行整理: ALTER INDEX <Index Name> ON <Table Name> REORGANIZE;    在重建或整理完索引之后,重新运行上面的语句来查看索引碎片的情况。   总结     上面的9个步骤并不是优化一个SQL语句必须的,尽管如此,你还是需要尽快找到是哪个步骤导致查询性能的瓶颈从而解决性能问题。就像文中开篇所说,性能的问题往往是由于更深层次的原因,比如CPU或内存压力,IO的瓶颈(这个列表会很长….),因此,更多的研究和阅读是解决性能问题所必须的。 ---------------------------------------- 原文链接:http://www.sqlservercentral.com/articles/Performance+Tuning/70647/ 分类: SQL SERVER 标签: 性能优化 本文转自CareySon博客园博客,原文链接http://www.cnblogs.com/CareySon/archive/2012/02/15/2352256.html,如需转载请自行联系原作者
文章
SQL · 存储 · 数据库 · 索引 · Go
2017-12-14
MySQL数据库优化大全方法汇总
随着数据和负载增加,MySQL数据库会日渐缓慢,性能越来越差,用户体验也随之变差,所以数据库性能优化十分紧迫,云吞铺子分享MySQL数据库优化大全: MySQL数据库优化 云吞铺子先模拟一下数据库访问流程,然后逐步的优化这些环节,可以从减少数据访问(减少磁盘访问)、返回更少数据(减少网络传输或磁盘访问)、减少交互次数(减少网络传输)、减少服务器CPU开销(减少CPU及内存开销)和利用更多资源(增加资源)几个方面来提升数据库性能。 可以从以下及方面优化MySQL数据库: 一:数据库结构优化 1)范式优化:表的设计合理化(符合3NF),比如消除冗余(节省空间); 2)反范式优化:比如适当加冗余等(减少join) 3)拆分表:分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法,可按月自动建表分区。 二:优化SQL语句 1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描; 2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3)很多时候用exists代替in是一个好的选择; 4)用Where子句替换HAVING子句,因为HAVING只会在检索出所有记录之后才对结果集进行过滤; 5)迅速的定位执行速度慢的语句、开启慢查询、设置慢查询时间、启用慢查询日志、通过mysqldumoslow工具对慢日志进行分类汇总; 6)析SQL语句,通过explain分析查询、通profiling可以得到更详细的信息; 7)创建索引(主键索引/唯一索引/全文索引/普通索引); 8)避免Select * (不查询多余的列与行); 9)使用视图(经常被查询的列数据,并且这些数据不被经常的修改,删除); 三:分表技术(水平分割、垂直分割)、分区技术 如果遇到大表的情况下,SQL语句优化已经无法继续优化了,我们可以考虑分表和分区,目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它。 分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。 1)都能提高mysql的性能,在高并发状态下都有一个良好的表现; 2)分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式,访问量不大,但是表数据很多的表,我们可以采取分区的方式等; 3)分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系; 4)表分区相对于分表,操作方便,不需要创建子表。 四:读写分离 MySQL读写分离可以参考:阿里云MySQL读写分离详解,本文来说说抛开阿里云来实现读写分离的方法: 方法一:php程序上自己做逻辑判断,写php代码的时候,自己在程序上做逻辑判读写匹配。select,insert、update、delete做正则匹配,根据结果选择写服务器(主服务器)。如果是select操作则选择读服务器(从服务器器) mysql_connect('读写的区分') 方法二:MySQL中间件,基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现。所以说主从复制是读写分离的基础。 五:存储过程 [模块化编程,可以提高速度] 存储过程是SQL语句和控制语句的预编译集合,保存在数据库中,可有应用程序调用执行,而且允许用户声明变量、逻辑控制语句及其他强大的编程功能。包含逻辑控制语句和数据操作语句,可以接收参数、输出参数、返回单个或多个结果值及返回值。 使用存储过程的优点:模块化程序设计,只需创建一次,以后即可调用该存储过程任意次;执行速度快,效率高;减少网络流量;具有良好的安全性。 六:对mysql配置优化 [配置最大并发数, 调整缓存大小] MySQL数据库优化大全方法汇总 七:MySQL服务器硬件升级 MySQL服务器硬件升级云吞铺子就不多赘述了,也可以使用云数据库,参考:阿里云MySQL云服务器详解 八:定时的去清除不需要的数据,定时进行碎片整理 1)查看表碎片的方法 select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from TABLES where TABLE_SCHEMA='test_db' and TABLE_NAME='table_name' limit 1; 2)Innodb存储引擎清理碎片方法: ALTER TABLE tablename ENGINE=InnoDB 3)Myisam存储引擎清理碎片方法: OPTIMIZE TABLE table_name 注意:MySQL碎片整理尽量选择业务不繁忙时清理,一个月清理一次即可。
文章
存储 · SQL · 缓存 · 关系型数据库 · MySQL · 中间件 · PHP · 数据库 · UED · 索引
2020-04-14
...
跳转至:
数据库
87799 人关注 | 33971 讨论 | 27375 内容
+ 订阅
  • 跟着源码核心贡献者学习Redis关键技术,免费训练营限时抢报!
  • 【OBCP分享会NO.1】高分上岸,考霸归来!
  • 一份助您的企业节省50%成本的数据库省钱攻略
查看更多 >
开发与运维
3695 人关注 | 91436 讨论 | 88123 内容
+ 订阅
  • 跟着源码核心贡献者学习Redis关键技术,免费训练营限时抢报!
  • 如何在ACK中进行自动化应用灰度发布
  • 收藏!这些IDE使用技巧,你都知道吗
查看更多 >
大数据
2097 人关注 | 13734 讨论 | 28581 内容
+ 订阅
  • 入选 SIGMOD2021 的时间序列多周期检测通用框架 RobustPeriod 如何支撑阿里业务场景?
  • 入选 SIGMOD2021 的时间序列多周期检测通用框架 RobustPeriod 如何支撑阿里业务场景?
  • 城市大脑 | 智慧城管解决方案
查看更多 >
安全
695 人关注 | 21383 讨论 | 26430 内容
+ 订阅
  • 提效神器,DataWorks OpenAPI开放7天免费试用!
  • 枚举的底层原理是什么?
  • YoC组件开发系列一:如何向T-HEAD OCC发布芯片产品组件
查看更多 >
人工智能
1964 人关注 | 7206 讨论 | 33392 内容
+ 订阅
  • 开年赢好运!最高6000元程序员加油包等你免费拿
  • 收藏!这些IDE使用技巧,你都知道吗
  • 入选 SIGMOD2021 的时间序列多周期检测通用框架 RobustPeriod 如何支撑阿里业务场景?
查看更多 >