2)根据explain执行查看你本次执行的查询语句的各个部分的特点
3)EXPLAIN结果中字段的意义:
1,key列指出优化器使用的索引,一般来说SQL查询中每个表仅使用一个索引,也错在索引合并的少数例外
2,rows提供了试图分析所有存在于累计结果集中航数目的mysql优化器的估计值,QEP(查询执行计划)很容易描述这个很困难的统计量
3,possible_keys列出优化器为查询选定的索引。一个会列出大量可能索引的QEP意味着备选索引数量太多,同时也可能存在无效的单列索引
4,key_len用于SQL语句的连接条件的键的长度,此列值对于确认索引的有效性以及多列索引中用到的列的数目很重要
key_len: 4 // INT NOT NULL
看他们网上的,写得都是千篇一律,同时,好多也写得不是很好,下面是我自己总结的有关mysql的使用细节,也是我在学习过程中的一些记录吧,希望对你有点帮助,后面有关存储过程等相关 *** 作还没有总结好,下次总结好了再发给你吧,呵呵~~~~~
MySql学习笔记
MySql概述:MySql是一个种关联数据库管理系统,所谓关联数据库就是将数据保存在不同的表中,而不是将所有数据放在一个大的仓库中。这样就增加了速度与提高了灵活性。并且MySql软件是一个开放源码软件。
注意,MySql所支持的TimeStamp的最大范围的问题,在32位机器上,支持的取值范围是年份最好不要超过2030年,然后如果在64位的机器上,年份可以达到2106年,而对于date、与datetime这两种类型,则没有关系,都可以表示到9999-12-31,所以这一点得注意下;还有,在安装MySql的时候,我们一般都选择Typical(典型安装)就可以了,当然,如果还有其它用途的话,那最好选择Complete(完全安装);在安装过程中,一般的还会让你进行服务器类型的选择,分别有三种服务器类型的选择,(Developer(开发机)、Server Machine(服务器)、Dedicated MySql Server Machine(专用MYSQL服务器)),选择哪种类型的服务器,只会对配置向导对内存等有影响,不然其它方面是没有什么影响的;所以,我们如果是开发者,选择开发机就可以啦;然后接下来,还会有数据库使用情况对话框的选择,我们只要按照默认就可以啦;
连接与断开服务器:
连接:在windows命令提示符下输入类似如下命令集:mysql –h host –u user –p
例如,我在用的时候输入的是:mysql –h localhost –u root –p
然后会提示要你输入用户密码,这个时候,如果你有密码的话,就输入密码敲回车,如果没有密码,直接敲回车,就可以进入到数据库客户端;连接远程主机上的mysql,可以用下面的命令:mysql –h 1590451 –u root –p 123
断开服务器:在进入客户端后,你可以直接输入quit然后回车就可以了;
下面就数据库相关命令进行相关说明
你可以输入以下命令对数据库表格或者数据库进行相关 *** 作,在这里就省略了,然后直接进行文字说明了;
Select version(),current_date;//从服务器得到当前mysql的版本号与当前日期
Select user(); //得到当前数据库的所有用户
Use databasename; 进入到指定的数据库当中,然后就可以 *** 作这个数据库当中的表格了
Show databases; //查询目前数据库中所有的数据库,并且显示出来;
Create batabase databasename;创建数据库,例如:create database manager;
Show tables; //查看当前数据库中的所有表格;
Create table tablename(colums);创建表,并且给表指定相关列,例如:create table pet(name varchar(20),owner varchar(20),species varchar(20),sex char(1),birth date,death date);
Describe tablename;将表当中的所有信息详细显示出来,例如:describe pet;
可以用命令一次插入多条记录,例如:
Insert into pet values(‘Puffball’,’Diane’,’hamster’,’f’,’1993-12-3’,null),( ‘Puffball’,’Diane’,’hamster’,’f’,’1993-12-3’,now());
Select from pet; 从pet表当中查询出所有的记录,显示出来;
Delete from pet where id=1;删除ID为1的那一条记录;
Update pet set birth=’2001-1-3’ where name=’Bowser’;更新name为Bowser的记录当中的birth字段的值;
Select distinct owner from pet;从pet表中选择出owner字段的值唯一的行,如果有多行记录这个字段的值相同,则只显示最后一次出现这一值的一行记录;
有关日期计算:
Select name,birth,curdate(),(year(curdate())-year(birth)) as age from pet;
此处,year()函数用于提取对应字段的年份,当然类似的还有month(),day()等;
在mysql当中,sql语句可以使用like查询,可以用”_”配任何单个字符,用”%”配任意数目字符,并且SQL模式默认是忽略大小写,例如:select from pet where name like ‘%fy’;
当然也可以用正则表达式模式进行配。
同时在sql当中,也要注意分组函数、排序函数、统计函数等相关用法,在这里只列举一二;
Select species,count() from pet group by speceis;
Select from pet order by birth desc;
查询最大值的相关 *** 作:
Select max(age) from pet;
取前多少项记录,这个主要用于分页查询 *** 作当中,
Select from pet order by birth desc limit 3;取前三条记录,
Select from pet order by birth desc limit 0,3;这个可以用于分页查询,limit后面的第一个参数,是起始位置,第二个参数是取记录条数;
有关创建表格自增长字段的写法:
Create table person(id int(4) not null auto_increment,name char(20) not null,primary key (id));
修改表 *** 作:
向表中增加字段:注意,在这个地方,如果是增加多个字段的时候,就要用括号括起来,不然会有问题,如果是单个字段的话,不用括号也没事;
Alter table test add(address varchar(50) not null default ‘xm’,email varchar(20) not null);
将表中某个字段的名字修改或者修改其对应的相关属性的时候,要用change对其进行 *** 作;
Alter table test change email email varchar(20) not null default ‘zz’;//不修改字段名
Alter table test change email Email varchar(30) not null;//修改字段名称
删除表中字段:
Alter table test drop email;//删除单个字段
Alter table test drop address,drop email;//删除多列
可以用Drop来取消主键与外键等,例如:
Alter table test drop foreign key fk_symbol;
删除索引:
Drop index index_name on table_name;
例如:drop index t on test;
向表中插入记录:注意,当插入表中的记录并不是所有的字段的时候,应该要在前面列出字段名称才行,不然会报错;
Insert into test(name) values(‘ltx’);
Insert into test values(1,’ltx’);
也可以向表中同时插入多列值,如:
Insert into test(name) values(‘ltx’),(‘hhy’),(‘xf’);
删除表中记录:
Delete from test;//删除表中所有记录;
Delete from test where id=1;//删除表中特定条件下的记录;
当要从一个表或者多个表当中查询出一些字段然后把这些字段又要插入到另一个表当中的时候,可以用insert …select语法;
Insert into testt(name) (select name from test where id=4);
从文件中读取行插入数据表中,可以用Load data infile语句;
Load data infile ‘testtxt’ into table test;
可以用Describe语法进行获取有关列的信息;
Describe test;//可以查看test表的所有信息,包括对应列字段的数据类型等;
MySql事务处理相关语法;
开始一项新的事务:start transaction或者begin transaction
提交事务:commit
事务回滚:rollback
set autocommit true|false 语句可以禁用或启用默认的autocommit模式,只可用于当前连接;
例子:
Start transaction;
Update person set name=’LJB’ where id=1;
Commit | rollback;
数据库管理语句
修改用户密码:以root用户为例,则可以写成下面的;mysql –u root –p 旧密码 –password 新密码
Mysql –u root –password 123;//将root用户的密码修改成123,由于root用户开始的时候,是没有密码的,所以-p旧密码就省略了;
例如修改一个有密码的用户密码:mysql –u ltx –p 123 –password 456;
增加一个用户test1,密码为abc,让他可以在任何时候主机上登陆,并对所有数据库有查询、插入、修改、删除的权限。
Grant select,insert,update,delete on to test1@”%” identified by ‘abc’;
增加一个test2用户,密码为abc,让他只可以在localhost上登陆,并且可以对数据库进行查询、插入、修改、删除 *** 作;
Grant select,insert,update,delete on mydb to test2@localhost identified by ‘abc’;
如果不想让用户test2有密码,可以再输入以下命令消掉密码:
Grant select,insert,update,delete on mydb to test2@localhost identified by “”;
备份数据库常用命令:mysqldump –h host –u username –p dbname>保存路径与文件名
然后回车后,会让你输入用户密码,输入密码后,再回车就OK啦;
Mysqldump –hlocalhost –uroot –p test >E:\db\testsql
这一命令具体解释下:
这个命令就是备份test数据库,并且将备份的内容存储为testsql文件,并且保存在E:\db下面;
命令当中-p 前面的test是数据库名,然后在数据库名后面要跟上一个”>”,然后接下来,就是写要保存的位置与保存文件的文件名;
将备份好的数据库导入到数据库当中去:也就是运行sql文件将数据库导入数据库当中去->
首先你得创建数据库,然后运行如下命令:mysql –hlocalhost –uroot –p linux<E:\db\testsql然后回车,再输入密码就可以啦;
解释下上面的命令:linux是就要导入的数据库名字,然后后面要紧跟着“<”符号,然后后面就是要导入的数据库文件;
将数据库导出保存成XML文件、从XML文件导入数据到数据库:
导出表中数据:mysql –X –h hostName –u userName –p Pwd –e “use DatabaseName;sql;” >xml文件名
或者用另外一种方式也行:mysqldump –xml –h hostName –u userName –p pwd dbName tableName //这一种只用于显示在当前的mysql客户端,不保存到文件当中;
相关说明:-X代表的是文件的格式是XML,然后-e一写不能掉,还有就是要用双引号将要 *** 作的语句括起来;单引号不行;
例如:mysql –X –hlocalhost –uroot –p –e “use test;select from pet;”>E:\db\outxml
从XML文件导入数据到数据库:
Insert into tableName values(1,load_file(‘filepath’));
例如:insert into pet values(1,load_file(“E:\db\outxml”));
查看数据库状态与查询进程:
Show status;//查看状态
Show processlist;//查看进程
更改用户名,用以下命令:
Update set user=”新名字” where user=”旧用户名”;
给数据库用户设置管理员权限:
Mysqladmin –h host –u username –p pwd;
以root用户为例;
Mysqladmin –h localhost –u root –p 123;
存储过程与函数
存储程序和函数分别是用create procedure和create function语句,一个程序要么是一个程序要么是一个函数,使用call语句来调用程序,并且程序只能用输出变量传回值;
要想在MySql51中创建子程序,必须具有create routine权限,并且alter routine和execute权限被自动授予它的创建者;
创建存储过程:
首先声明分隔符,所谓分隔符是指你通知mysql客户端你已经输入一个sql语句的字符或字符串符号,在这里我们就以“//”为分隔符;
Delimiter 分隔符\
如:delimiter //
再创建存储过程:
Create procedure 存储过程名 ( )
声明存储过程开始:
begin
然后开始写存储过程体:
Select from pet;
结束存储过程:
End;//
刚刚的例子全部写出来,完整的代码就是:
Delimiter //
Create procedure spt () //注意,这个地方,存储过程名与括号之间要有个空格
Begin
Select from pet;
End;//到这里,整个存储过程就算写完啦
执行存储过程:
Call 存储过程名 ();//
如,我们执行刚刚创建的存储过程,就是:
Call spt ();//
需要说明的是存储过程名后面一定要加个空格,而后面那个括号,则是用于传送参数的参数列表;另外,我们创建存储过程完成后,也只是创建了,但是只有调用call 存储过程名 ();//后才算执行完毕,才能看到存储过程的结果;
另外,团IDC网上有许多产品团购,便宜有口碑
1SQL优化的原则是:将一次 *** 作需要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量。
调整不良SQL通常可以从以下几点切入:
检查不良的SQL,考虑其写法是否还有可优化内容
检查子查询考虑SQL子查询是否可以用简单连接的方式进行重新书写
检查优化索引的使用
考虑数据库的优化器
2避免出现SELECTFROMtable语句,要明确查出的字段。
3在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。
4查询时尽可能使用索引覆盖。即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。
5在判断有无符合条件的记录时建议不要用SELECTCOUNT()和selecttop1语句。
6使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句的最里层进行限定,以减少数据的处理量。
7应绝对避免在orderby子句中使用表达式。
8如果需要从关联表读数据,关联的表一般不要超过7个。
9小心使用IN和OR,需要注意In集合中的数据量。建议集合中的数据不超过200个。
10用代替,>用>=代替,
11在查询时尽量减少对多余数据的读取包括多余的列与多余的行。
12对于复合索引要注意,例如在建立复合索引时列的顺序是F1,F2,F3,则在where或orderby子句中这些字段出现的顺序要与建立索引时的字段顺序一致,且必须包含第一列。只能是F1或F1,F2或F1,F2,F3。否则不会用到该索引。
13多表关联查询时,写法必须遵循以下原则,这样做有利于建立索引,提高查询效率。格式如下selectsum(table1je)fromtable1table1,table2table2,table3table3where(table1的等值条件(=))and(table1的非等值条件)and(table2与table1的关联条件)and(table2的等值条件)and(table2的非等值条件)and(table3与table2的关联条件)and(table3的等值条件)and(table3的非等值条件)。
注:关于多表查询时from后面表的出现顺序对效率的影响还有待研究。
14子查询问题。对于能用连接方式或者视图方式实现的功能,不要用子查询。例如:selectnamefromcustomerwherecustomer_idin(selectcustomer_idfromorderwheremoney>1000)。应该用如下语句代替:selectnamefromcustomerinnerjoinorderoncustomercustomer_id=ordercustomer_idwhereordermoney>100。
15在WHERE子句中,避免对列的四则运算,特别是where条件的左边,严禁使用运算与函数对列进行处理。比如有些地方substring可以用like代替。
16如果在语句中有notin(in) *** 作,应考虑用notexists(exists)来重写,最好的办法是使用外连接实现。
17对一个业务过程的处理,应该使事物的开始与结束之间的时间间隔越短越好,原则上做到数据库的读 *** 作在前面完成,数据库写 *** 作在后面完成,避免交叉。
18请小心不要对过多的列使用列函数和orderby,groupby等,谨慎使用disti软件开发t。
19用unionall代替union,数据库执行union *** 作,首先先分别执行union两端的查询,将其放在临时表中,然后在对其进行排序,过滤重复的记录。
当已知的业务逻辑决定queryA和queryB中不会有重复记录时,应该用unionall代替union,以提高查询效率。
数据更新的效率
1在一个事物中,对同一个表的多个insert语句应该集中在一起执行。
2在一个业务过程中,尽量的使insert,update,delete语句在业务结束前执行,以减少死锁的可能性。
数据库物理规划的效率
为了避免I/O的冲突,我们在设计数据库物理规划时应该遵循几条基本的原则(以ORACLE举例):
table和index分离:table和index应该分别放在不同的tablespace中。
RollbackSegment的分离:RollbackSegment应该放在独立的Tablespace中。
SystemTablespace的分离:SystemTablespace中不允许放置任何用户的object。(mssql中primaryfilegroup中不允许放置任何用户的object)
TempTablesace的分离:建立单独的TempTablespace,并为每个user指定defaultTempTablespace
避免碎片:但segment中出现大量的碎片时,会导致读数据时需要访问的block数量的增加。对经常发生DML *** 作的segemeng来说,碎片是不能完全避免的。所以,我们应该将经常做DML *** 作的表和很少发生变化的表分离在不同的Tablespace中。
当我们遵循了以上原则后,仍然发现有I/O冲突存在,我们可以用数据分离的方法来解决。
连接Table的分离:在实际应用中经常做连接查询的Table,可以将其分离在不同的Taclespace中,以减少I/O冲突。
使用分区:对数据量很大的Table和Index使用分区,放在不同的Tablespace中。
在实际的物理存储中,建议使用RAID。日志文件应放在单独的磁盘中。
以上就是关于如何对 *** 作数据库进行优化全部的内容,包括:如何对 *** 作数据库进行优化、请问使用insert插入大量数据怎样优化A(也就是速度快点)、如何优化数据库提高数据库的效率等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)