我们都知道,服务器数据库的开发一般都是通过java或者是PHP语言来编程实现的,而为了提高我们数据库的运行速度和效率,数据库优化也成为了我们每日的工作重点,今天,北京IT培训就一起来了解一下mysql服务器数据库的优化方法。
为什么要了解索引
真实案例
案例一:大学有段时间学习爬虫,爬取了知乎300w用户答题数据,存储到mysql数据中。那时不了解索引,一条简单的“根据用户名搜索全部回答的sql“需要执行半分钟左右,完全满足不了正常的使用。
案例二:近线上应用的数据库频频出现多条慢sql风险提示,而工作以来,对数据库优化方面所知甚少。例如一个用户数据页面需要执行很多次数据库查询,性能很慢,通过增加超时时间勉强可以访问,但是性能上需要优化。
索引的优点
合适的索引,可以大大减小mysql服务器扫描的数据量,避免内存排序和临时表,提高应用程序的查询性能。
索引的类型
mysql数据中有多种索引类型,primarykey,unique,normal,但底层存储的数据结构都是BTREE;有些存储引擎还提供hash索引,全文索引。
BTREE是常见的优化要面对的索引结构,都是基于BTREE的讨论。
B-TREE
查询数据简单暴力的方式是遍历所有记录;如果数据不重复,就可以通过组织成一颗排序二叉树,通过二分查找算法来查询,大大提高查询性能。而BTREE是一种更强大的排序树,支持多个分支,高度更低,数据的插入、删除、更新更快。
现代数据库的索引文件和文件系统的文件块都被组织成BTREE。
btree的每个节点都包含有key,data和只想子节点指针。
btree有度的概念d>=1。假设btree的度为d,则每个内部节点可以有n=[d+1,2d+1)个key,n+1个子节点指针。树的大高度为h=Logb[(N+1)/2]。
索引和文件系统中,B-TREE的节点常设计成接近一个内存页大小(也是磁盘扇区大小),且树的度非常大。这样磁盘I/O的次数,就等于树的高度h。假设b=100,一百万个节点的树,h将只有3层。即,只有3次磁盘I/O就可以查找完毕,性能非常高。
索引查询
建立索引后,合适的查询语句才能大发挥索引的优势。
另外,由于查询优化器可以解析客户端的sql语句,会调整sql的查询语句的条件顺序去匹配合适的索引。
在cmd命令提示符下输入
mysql -u root -p回车,然后输入密码回车
进入mysql命令行模式
create database databasename;//创建数据库
use databasename;//使用数据库
create table tablename(
id int not null primary key
);
这样就创建了一个只有id字段的tablename表!
F5ter键。mysql执行按钮是F5ter键,只需要将光标放在SQL语句的最后一行,然后按下F5ter键即可执行。按钮,是一种常用的控制电器元件,常用来接通或断开控制电路,从而达到控制电动机或电气设备运行目的的一种开关。
mysql 通过函数执本地命令、外部程序
昨天接到一个需求,要求在mysql的触发器中执行一个外部程序。
一开始没有什么头绪,后来发现嘿嘿。
id=211
有个叫mysqludf的一个东西,用起来还不错。
不过这个东西仅仅在linux下试了试,效果还行。
步骤如下:
一、解压附件的压缩包之后
如果不想自己编译的话,把lib_mysqludf_sysso文件放到 mysql的lib/mysql/plugin/
目录下。
二、执行chcon -t texrel_shlib_t mysql/lib/mysql/plugin/lib_mysqludf_sysso
三、创建函数
DROP FUNCTION IF EXISTS lib_mysqludf_sys_info;
DROP FUNCTION IF EXISTS sys_get;
DROP FUNCTION IF EXISTS sys_set;
DROP FUNCTION IF EXISTS sys_exec;
DROP FUNCTION IF EXISTS sys_eval;
CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sysso';
CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sysso';
CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sysso';
CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sysso';
CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sysso';
四、测试
1、准备sh文件
在linux系统中执行下面的命令
su mysql
mkdir /mysqlUDFtest
cd mysqlUDFtest
vi testsh
#/bin/sh
date > testlogtxt
chmod +x /testsh
2、准备数据库表和触发器
选择一个数据库执行如下命令:
CREATE TABLE test1(a1 INT) type=InnoDB;
CREATE TABLE test2(a2 INT) type=InnoDB;
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY) type=InnoDB;
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
) type=InnoDB;
DELIMITER |
DROP TRIGGER /!50032 IF EXISTS / `test``testref`|
create trigger `test``testref` BEFORE INSERT on `test``test1`
for each row BEGIN
DECLARE done INT DEFAULT 999;
INSERT INTO test2 SET a2 = NEWa1;
DELETE FROM test3 WHERE a3 = NEWa1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEWa1;
set done = sys_exec("/mysqlUDFtest/testsh");
IF done != 0 then
INSERT INTO `$amp;<amp ;$gt;22t3`="" (a,b); end="" if;END;
|
执行drop数据库会先将该数据库下的所有表格和数据全部删除,这个过程是需要一定的时间完成的,对应用程序和数据库服务器都会有一定的负担,如果delete的数据量很大,那么该 *** 作所需要的时间就会非常长,这样就会占用很多的CPU资源和内存,可能会导致整个服务阻塞,降低程序执行效率。因此在进行drop *** 作时,需要仔细考虑,确保在适当的时间点执行,同时也需要注意备份所有重要数据。
MySQL是一种常用的开源关系型数据库管理系统,update则是MySQL用来修改表中数据的语句。如果需要对表中的数据进行批量修改,可以使用循环进行多次update,但这样的效率较低,同时也可能会对数据库造成较大的负担。为了提高效率和避免负担,可以将数据按照一定的规则分成若干个部分,每次只更新其中的一部分数据,从而实现批量修改的目的。例如,可以将表中的数据按照主键ID值分成10部分,每次只更新其中的一部分,这样就可以将一次大量的修改 *** 作分解成多个小 *** 作,减少了数据库的负荷。在分批执行的过程中,需要注意一些问题。首先,分批的原则需要合理,应该根据实际需求来决定分成多少份。其次,每次执行update *** 作的记录数应该适当,不能过大或过小,以免对数据库的性能产生不利影响。最后,对于数据安全性要求比较高的情况,需要保证分批 *** 作的顺序和完整性。需要注意的是,分批execute update *** 作是很好的方法来避免影响CPU浪费等问题,并且对于大数据集 *** 作可以提高效率。但是,在数据量较小的情况下,使用分批进行更新 *** 作可能会增加不必要的复杂性,并且会降低代码的可读性和可维护性。因此,在进行MySQL update *** 作时,需要根据实际情况来决定是否使用分批方式。
以上就是关于北京IT培训分享mysql数据库的优化方法全部的内容,包括:北京IT培训分享mysql数据库的优化方法、如何创建从VC和MySQL代码的可执行安装程序吗、mysql执行按钮是哪个等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)