MySQL基本使用

    • MySQL常用sql语句
    • 部门dep 部门名称dname
    • 部门dep 一月份 二月份 三月份
    • null null 9
    • 一个表中的Id有多个记录把所有这个id的记录查出来并显示有多少条记录
    • MySQL 数据库常用命令小结
    • 字符串乱码问题解决集合
    • MySQL通配符
    • 高性能的mysql语法
      • SQL语句编写注意问题
        • IS NULL 与 IS NOT NULL
        • 联接列
        • 带通配符的like语句
        • Order by语句
        • NOT
        • IN和EXISTS
      • MySQL性能优化
        • 简介
        • 数据库设计和查询优化
    • Mysql数据类型
      • MySQL的数据类型
      • MySQL的列字段类型
        • 1数值列类型
        • 2字符串列类型
        • 3日期时间列类型
      • 举例
    • 怎么提高Mysql执行sql导入的速度
    • Ubuntu下远程访问MySQL数据库

MySQL常用sql语句

http://www.cnblogs.com/picaso/archive/2012/05/17/2505895.html
http://www.2cto.com/database/201412/365013.html
http://www.jb51.net/article/28288.htm
1、说明:创建数据库
Create DATABASE database-name

2、说明:删除数据库
drop database dbname

3、说明:备份sql server
— 创建 备份数据的 device
USE master
EXEC sp_addumpdevice ‘disk’, ‘testBack’, ‘c:\mssql7backup\MyNwind_1.dat’
— 开始 备份
BACKUP DATABASE pubs TO testBack

4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表:
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only

5、说明:删除新表
drop table tabname

6、说明:增加一个列
Alter table tabname add column col type
注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型
的长度。

7、说明:添加主键: Alter table tabname add primary key(col)
说明:删除主键: Alter table tabname drop primary key(col)

8、说明:创建索引:create [unique] index idxname on tabname(col….)
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。

9、说明:创建视图:create view viewname as select statement
删除视图:drop view viewname

10、说明:几个简单的基本的sql语句
选择:select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ‘%value1%’ —like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1

11、说明:几个高级查询运算词
A: UNION 运算符
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生
出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派
生表的每一行不是来自 TABLE1 就是来自 TABLE2。
B: EXCEPT 运算符
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个
结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。
C: INTERSECT 运算符
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果
表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
注:使用运算词的几个查询结果行必须是一致的。

12、说明:使用外连接
A、left outer join:
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
sql: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right outer join:
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
C:full outer join:
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

13、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:select * into b from a where 1<>1
法二:select top 0 * into b from a

14、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

15、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in ‘”&Server.MapPath(“.”)&”\data.mdb” &”’ where..

16、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN
(1,2,3)

17、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from
table where table.title=a.title) b

18.说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

19、说明:在线视图查询(表名1:a )
select * from (Select a,b,c FROM a) T where t.a > 1;

20、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2

21、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

22、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where
table1.field1=table2.field1 )

23、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join
d on a.a=d.d where …..

24、说明:日程安排提前五分钟提醒
sql: select * from 日程安排 where datediff(‘minute’,f开始时间,getdate())>5

25、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段
desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

26、说明:前10条记录
select top 10 * form table1 where 范围

27、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用
于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where
tb.b=ta.b)

28、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个
结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

29、说明:随机取出10条数据
select top 10 * from tablename order by newid()

30、说明:随机选择记录
select newid()

31、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by
col1,col2,…)

32、说明:列出数据库里所有的表名
select name from sysobjects where type=’U’

33、说明:列出表里的所有的
select name from syscolumns where id=object_id(‘TableName’)

34、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似
select 中的case。
select type,sum(case vender when ‘A’ then pcs else 0 end),sum(case vender when ‘C’
then pcs else 0 end),sum(case vender when ‘B’ then pcs else 0 end) FROM tablename
group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

35、说明:初始化表table1
TRUNCATE TABLE table1

36、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by
id desc
  
随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
  对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能
要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
Randomize
RNumber = Int(Rnd*499) +1
 
While Not objRec.EOF
If objRec(“ID”) = RNumber THEN
… 这里是执行脚本 …
end if
objRec.MoveNext
Wend
 
  这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总
数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由
THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就
长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,
后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了?
  采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示

Randomize
RNumber = Int(Rnd*499) + 1
 
sql = “Select * FROM Customers Where ID = ” & RNumber
 
set objRec = ObjConn.Execute(SQL)
Response.WriteRNumber & ” = ” & objRec(“ID”) & ” ” & objRec(“c_email”)
 
  不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可
按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就
大大降低了处理时间。
再谈随机数
  现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者
想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况
了。
  为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询
数据库获得匹配这些数字的记录:
sql = “Select * FROM Customers Where ID = ” & RNumber & ” or ID = ” & RNumber2 & ” or
ID = ” & RNumber3
 
  假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者
数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是
Select 语句只显示一种可能(这里的ID 是自动生成的号码):
sql = “Select * FROM Customers Where ID BETWEEN ” & RNumber & ” AND ” & RNumber & “+
9”
  注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。
 
随机读取若干条记录,测试过
Access语法:Select top 10 * From 表名 orDER BY Rnd(id)
sql server:select top n * from 表名 order by newid()
mysqlelect * From 表名 order By rand() Limit n
Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有
自己测试, 现在记下以备后查)
语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on
table1.fd1,table2.fd1 where …
使用SQL语句 用…代替过长的字符串显示
语法:
SQL数据库:select case when len(field)>10 then left(field,10)+’…’ else field end as
news_name,news_id from tablename
Access数据库:Select iif(len(field)>2,left(field,2)+’…’,field) FROM tablename;
 
Conn.Execute说明
Execute方法
  该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两
种:

(1).执行SQL查询语句时,将返回查询得到的记录集。用法为:
    Set 对象变量名=连接对象.Execute(“SQL 查询语言”)
   Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set
方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

    (2).执行SQL的操作性语言时,没有记录集的返回。此时用法为:
    连接对象.Execute “SQL 操作性语句” [, RecordAffected][, Option]
      ?RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录
数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
      ?Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute
方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。
*BeginTrans、RollbackTrans、CommitTrans方法
  这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;
RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
  事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若
其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
  BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务
处理的语句。判断事务处理是否成功,可通过连接对象的Error集合来实现,若Error集合的成员个
数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一个错误信
息。

37、一道SQL语句面试题,关于group by
表内容:
2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负
如果要生成下列结果, 该如何写sql语句?
胜 负
2005-05-09 2 2
2005-05-10 1 2
答:代码如下:
create table #tmp(rq varchar(10),shengfu nchar(1))
insert into #tmp values(‘2005-05-09’,’胜’)
insert into #tmp values(‘2005-05-09’,’胜’)
insert into #tmp values(‘2005-05-09’,’负’)
insert into #tmp values(‘2005-05-09’,’负’)
insert into #tmp values(‘2005-05-10’,’胜’)
insert into #tmp values(‘2005-05-10’,’负’)
insert into #tmp values(‘2005-05-10’,’负’)
1)select rq, sum(case when shengfu=’胜’ then 1 else 0 end)’胜’,sum(case when shengfu=’
负’ then 1 else 0 end)’负’ from #tmp group by rq
2) select N.rq,N.勝,M.負 from (
select rq,勝=count(*) from #tmp where shengfu=’胜’group by rq)N inner join
(select rq,負=count(*) from #tmp where shengfu=’负’group by rq)M on N.rq=M.rq
3)select a.col001,a.a1 胜,b.b1 负 from
(select col001,count(col001) a1 from temp1 where col002=’胜’ group by col001) a,
(select col001,count(col001) b1 from temp1 where col002=’负’ group by col001) b
where a.col001=b.col001

38、请教一个面试中遇到的SQL语句的查询问题
表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列
否则选择C列。
示例如下:
select (case when a>b then a else b end ),
(case when b>c then b esle c end)
from table_name

39、一个日期判断的sql语句?
请取出tb_send表中日期(SendTime字段)为当天的所有记录?(SendTime字段为datetime型,包含日
期与时间)
示例如下:
select * from tb where datediff(dd,SendTime,getdate())=0

40、有一张表,里面有3个字段:语文,数学,英语。其中有3条记录分别表示语文70分,数学80分
,英语58分,请用一条sql语句查询出这三条记录并按以下条件显示出来(并写出您的思路):
大于或等于80表示优秀,大于或等于60表示及格,小于60分表示不及格。
显示格式:
语文 数学 英语
及格 优秀 不及格
示例如下:
select
(case when 语文>=80 then ‘优秀’
when 语文>=60 then ‘及格’
else ‘不及格’) as 语文,
(case when 数学>=80 then ‘优秀’
when 数学>=60 then ‘及格’
else ‘不及格’) as 数学,
(case when 英语>=80 then ‘优秀’
when 英语>=60 then ‘及格’
else ‘不及格’) as 英语,
from table
41、在sqlserver2000中请用sql创建一张用户临时表和系统临时表,里面包含两个字段ID和
IDValues,类型都是int型,并解释下两者的区别?
用户临时表:create table #xx(ID int, IDValues int)
系统临时表:create table ##xx(ID int, IDValues int)
区别:
用户临时表只对创建这个表的用户的Session可见,对其他进程是不可见的.
当创建它的进程消失时这个临时表就自动删除.
全局临时表对整个SQL Server实例都可见,但是所有访问它的Session都消失的时候,它也自动删除.
42、sqlserver2000是一种大型数据库,他的存储容量只受存储介质的限制,请问它是通过什么方
式实现这种无限容量机制的。
它的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQL Server的存储容量是可以扩
大的.
SQL Server 2000 数据库有三种类型的文件:
主要数据文件
主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件
。主要数据文件的推荐文件扩展名是 .mdf。
次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些
数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。
日志文件
日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止
一个。日志文件的推荐文件扩展名是 .ldf。
43、请用一个sql语句得出结果
从table1,table2中取出如table3所列格式数据,注意提供的数据及结果不准确,只是作为一个格
式向大家请教。
如使用存储过程也可以。
table1
月份mon 部门dep 业绩yj
一月份 01 10
一月份 02 10
一月份 03 5
二月份 02 8
二月份 04 9
三月份 03 8
table2

部门dep 部门名称dname

01 国内业务一部
02 国内业务二部
03 国内业务三部
04 国际业务部
table3 (result)

部门dep 一月份 二月份 三月份

01 10 null null
02 10 8 null
03 null 5 8

04 null null 9

1)
select a.部门名称dname,b.业绩yj as ‘一月份’,c.业绩yj as ‘二月份’,d.业绩yj as ‘三月份’
from table1 a,table2 b,table2 c,table2 d
where a.部门dep = b.部门dep and b.月份mon = ‘一月份’ and
a.部门dep = c.部门dep and c.月份mon = ‘二月份’ and
a.部门dep = d.部门dep and d.月份mon = ‘三月份’ and
2)
select a.dep,
sum(case when b.mon=1 then b.yj else 0 end) as ‘一月份’,
sum(case when b.mon=2 then b.yj else 0 end) as ‘二月份’,
sum(case when b.mon=3 then b.yj else 0 end) as ‘三月份’,
sum(case when b.mon=4 then b.yj else 0 end) as ‘四月份’,
sum(case when b.mon=5 then b.yj else 0 end) as ‘五月份’,
sum(case when b.mon=6 then b.yj else 0 end) as ‘六月份’,
sum(case when b.mon=7 then b.yj else 0 end) as ‘七月份’,
sum(case when b.mon=8 then b.yj else 0 end) as ‘八月份’,
sum(case when b.mon=9 then b.yj else 0 end) as ‘九月份’,
sum(case when b.mon=10 then b.yj else 0 end) as ‘十月份’,
sum(case when b.mon=11 then b.yj else 0 end) as ‘十一月份’,
sum(case when b.mon=12 then b.yj else 0 end) as ‘十二月份’,
from table2 a left join table1 b on a.dep=b.dep

44、华为一道面试题

一个表中的Id有多个记录,把所有这个id的记录查出来,并显示有多少条记录。

select id, Count() from tb group by id having count()>1
select*from(select count(ID) as count from table group by ID)T where T.count>1

MySQL 数据库常用命令小结

http://blog.csdn.net/sunboy_2050/article/details/5131863

字符串乱码问题解决集合

http://blog.csdn.net/sunboy_2050/article/details/5130789

MySQL通配符

http://blog.csdn.net/sunboy_2050/article/details/5130386

高性能的mysql语法

http://blog.csdn.net/sunboy_2050/article/details/5130454

SQL语句编写注意问题

下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

1. IS NULL 与 IS NOT NULL

不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

2. 联接列

对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。

下面是一个采用联接查询的SQL语句,

select * from employss
where
first_name||''||last_name ='Beill Cliton' 

上面这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。

当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。

Select * from employee
where
first_name ='Beill' and last_name ='Cliton' 

遇到下面这种情况又如何处理呢?如果一个变量(name)中存放着Bill Cliton这个员工的姓名,对于这种情况我们又如何避免全程遍历,使用索引呢?可以使用一个函数,将变量name中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是SQL查询脚本:

select * from employee
where
first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1)
and
last_name = SUBSTR('&&name',INSTR('&&name’,' ')+1)  

3. 带通配符(%)的like语句

同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:

select * from employee where last_name like '%cliton%' 

这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:

select * from employee where last_name like 'c%'  

4. Order by语句

ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。

仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。

5. NOT

我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:


... where not (status ='VALID') 

如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:

... where status <>'INVALID' 

再看下面这个例子:

select * from employee where salary<>3000; 

对这个查询,可以改写为不使用NOT:

select * from employee where salary<3000 or salary>3000; 

虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。

6. IN和EXISTS

有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。

第一种格式是使用IN操作符:

... where column in(select * from ... where ...); 

第二种格式是使用EXIST操作符:

... where exists (select 'X' from ...where ...); 

我相信绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。

第二种格式中,子查询以‘select ‘X’开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where语句中使用的列存在索引)。相对于IN子句来说,EXISTS使用相连子查询,构造起来要比IN子查询困难一些。

通过使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。

同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。

任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。

MySQL性能优化

1. 简介

在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响。MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。因此在产品中使用MySQL数据库必须进行必要的优化。
优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器端优化,存储引擎优化。

2. 数据库设计和查询优化

在MySQL Server性能调优中,首先要考虑的就是Database Schema设计,这一点是非常重要的。一个糟糕的Schema设计即使在性能调优的MySQL Server上运行,也会表现出很差的性能;和Schema相似,查询语句的设计也会影响MySQL的性能,应该避免写出低效的SQL查询。这一节将详细讨论这两方面的优化。

2.1 Schema Design
Schema的优化取决于将要运行什么样的query,不同的query会有不同的Schema优化方案。2.2节将介绍Query Design的优化。Schema设计同样受到预期数据集大小的影响。Schema设计时主要考虑:标准化,数据类型,索引。

2.1.1 标准化

标准化是在数据库中组织数据的过程。其中包括,根据设计规则创建表并在这些表间建立关系;通过取消冗余度与不一致相关性,该设计规则可以同时保护数据并提高数据的灵活性。通常数据库标准化是让数据库设计符合某一级别的范式,通常满足第三范式即可。也有第四范式(也称为 Boyce Codd范式,BCNF))与第五范式存在,但是在实际设计中很少考虑。忽视这些规则可能使得数据库的设计不太完美,但这不应影响功能。
标准化的特点:

1) 所有的“对象”都在它自己的table中,没有冗余。
2) 数据库通常由E-R图生成。
3) 简洁,更新属性通常只需要更新很少的记录。
4) Join操作比较耗时。
5) Select,sort优化措施比较少。
6) 适用于OLTP应用。

非标准化的特点:

1) 在一张表中存储很多数据,数据冗余。
2) 更新数据开销很大,更新一个属性可能会更新很多表,很多记录。
3) 在删除数据是有可能丢失数据。
4) Select,order有很多优化的选择。
5) 适用于DSS应用。

标准化和非标准化都有各自的优缺点,通常在一个数据库设计中可以混合使用,一部分表格标准化,一部分表格保留一些冗余数据:

1) 对OLTP使用标准化,对DSS使用非标准化
2) 使用物化视图。MySQL不直接支持该数据库特性,但是可以用MyISAM表代替。
3) 冗余一些数据在表格中,例如将ref_id和name存在同一张表中。但是要注意更新问题。
4) 对于一些简单的对象,直接使用value作为建。例如IP address等
5) Reference by PRIMARY/UNIQUE KEY。MySQL可以优化这种操作,例如:
java 代码

    select city_name
    from city,state
    where state_id=state.id and state.code=‘CA’” converted to “select city_name from city where state_id=12 

2.1.2 数据类型
最基本的优化之一就是使表在磁盘上占据的空间尽可能小。这能带来性能非常大的提升,因为数据小,磁盘读入较快,并且在查询过程中表内容被处理所占用的内存更少。同时,在更小的列上建索引,索引也会占用更少的资源。
可以使用下面的技术可以使表的性能更好并且使存储空间最小:

1) 使用正确合适的类型,不要将数字存储为字符串。
2) 尽可能地使用最有效(最小)的数据类型。MySQL有很多节省磁盘空间和内存的专业化类型。
3) 尽可能使用较小的整数类型使表更小。例如,MEDIUMINT经常比INT好一些,因为MEDIUMINT列使用的空间要少25%。
4) 如果可能,声明列为NOT NULL。它使任何事情更快而且每列可以节省一位。注意如果在应用程序中确实需要NULL,应该毫无疑问使用它,只是避免 默认地在所有列上有它。
5) 对于MyISAM表,如果没有任何变长列(VARCHAR、TEXT或BLOB列),使用固定尺寸的记录格式。这比较快但是不幸地可能会浪费一些空间。即使你已经用CREATE选项让VARCHAR列ROW_FORMAT=fixed,也可以提示想使用固定长度的行。
6) 使用sample character set,例如latin1。尽量少使用utf-8,因为utf-8占用的空间是latin1的3倍。可以在不需要使用utf-8的字段上面使用latin1,例如mail,url等。

2.1.3 索引
所有MySQL列类型可以被索引。对相关列使用索引是提高SELECT操作性能的最佳途径。使用索引应该注意以下几点:

1) MySQL只会使用前缀,例如key(a, b) …where b=5 将使用不到索引。
2) 要选择性的使用索引。在变化很少的列上使用索引并不是很好,例如性别列。
3) 在Unique列上定义Unique index。
4) 避免建立使用不到的索引。
5) 在Btree index中(InnoDB使用Btree),可以在需要排序的列上建立索引。
6) 避免重复的索引。
7) 避免在已有索引的前缀上建立索引。例如:如果存在index(a,b)则去掉index(a)。
8) 控制单个索引的长度。使用key(name(8))在数据的前面几个字符建立索引。
9) 越是短的键值越好,最好使用integer。
10) 在查询中要使用到索引(使用explain查看),可以减少读磁盘的次数,加速读取数据。
11) 相近的键值比随机好。Auto_increment就比uuid好。
12) Optimize table可以压缩和排序index,注意不要频繁运行。
13) Analyze table可以更新数据。

2.2 Designing queries
查询语句的优化是一个Case by case的问题,不同的sql有不同的优化方案,在这里我只列出一些通用的技巧。

1) 在有index的情况下,尽量保证查询使用了正确的index。可以使用EXPLAIN select …查看结果,分析查询。
2) 查询时使用匹配的类型。例如select * from a where id=5, 如果这里id是字符类型,同时有index,这条查询则使用不到index,会做全表扫描,速度会很慢。正确的应该是 … where id=”5” ,加上引号表明类型是字符。
3) 使用--log-slow-queries –long-query-time=2查看查询比较慢的语句。然后使用explain分析查询,做出优化。

Mysql数据类型

转自:http://blog.csdn.net/sunboy_2050/article/details/4470253

1. MySQL的数据类型

(1)数值型

数值是诸如32 或153.4 这样的值。MySQL 支持科学表示法,科学表示法由整数或浮点数后跟“e”或“E”、一个符号(“+”或“-”)和一个整数指数来表示。1.24E+12 和23.47e-1 都是合法的科学表示法表示的数。而1.24E12 不是合法的,因为指数前的符号未给出。

浮点数由整数部分、一个小数点和小数部分组成。整数部分和小数部分可以分别为空,但不能同时为空。

(2)字符(串)型

字符型(也叫字符串型,简称串)可用单引号也可用双引号将串值括起来。

初学者往往分不清数值87398143和字符串87398143的区别。关键就在于:数值型的87398143是要参与计算的,比如它是金融中的一个货款总额;而字符型的87398143是不参与计算的,只是表示电话号码。

(3)日期和时间型

日期和时间是一些诸如“2006-07-12”或“12:30:43”这样的值。MySQL还支持日期/时间的组合,如“2006-07-12 12:30:43”。

(4)NULL值

NULL表示未知值。比如填写表格中通讯地址不清楚留空不填写,这就是NULL值。

可以在列类型之后指定可选的类型说明属性,以及指定更多的常见属性。属性起修饰类型的作用,并更改其处理列值的方式,属性有以下类型:

(1)专用属性用于指定列。例如,UNSIGNED 属性只针对整型,而BINARY属性只用于CHAR 和VARCHAR。

(2)通用属性除少数列之外可用于任意列。可以指定NULL 或NOT NULL 以表示某个列是否能够存放NULL。还可以用DEFAULT,def_value 来表示在创建一个新行但未明确给出该列的值时,该列可赋予值def_value。def_value 必须为一个常量;它不能是表达式,也不能引用其他列。不能对BLOB 或TEXT 列指定缺省值。

如果想给出多个列的专用属性,可按任意顺序指定它们,只要它们跟在列类型之后、通用属性之前即可。类似地,如果需要给出多个通用属性,也可按任意顺序给出它们,只要将它们放在列类型和可能给出的列专用属性之后即可 。

2. MySQL的列(字段)类型

2.1数值列类型

MySQL基本使用_第1张图片
MySQL基本使用_第2张图片
MySQL基本使用_第3张图片
MySQL提供了五种整型: TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT

INT为INTEGER的缩写。这些类型在可表示的取值范围上是不同的。 整数列可定义为UNSIGNED从而禁用负值;这使列的取值范围为0以上。各种类型的存储量需求也是不同的。取值范围较大的类型所需的存储量较大。

MySQL 提供三种浮点类型: FLOAT、DOUBLE和DECIMAL

与整型不同,浮点类型不能是UNSIGNED的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大 值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。

在选择了某种数值类型时,应该考虑所要表示的值的范围,只需选择能覆盖要取值的范围的最小类 型即可。选择较大类型会对空间造成浪费,使表不必要地增大,处理起来没有选择较小类型那样有效。对于整型值,如果数据取值范围较小,如人员年龄或兄弟姐妹 数,则TINYINT最合适。MEDIUMINT能够表示数百万的值并且可用于更多类型的值,但存储代价较大。BIGINT在全部整型中取值范围最大,而 且需要的存储空间是表示范围次大的整型INT类型的两倍,因此只在确实需要时才用。对于浮点值,DOUBLE占用FLOAT的两倍空间。除非特别需要高精 度或范围极大的值,一般应使用只用一半存储代价的FLOAT型来表示数据。

在定义整型列时,可以指定可选的显示尺寸M。如果这样,M应该是一个1 到255的整数。它表示用来显示列中值的字符数。例如,MEDIUMINT(4)指定了一个具有4个字符显示宽度的MEDIUMINT列。如果定义了一个 没有明确宽度的整数列,将会自动分配给它一个缺省的宽度。缺省值为每种类型的“最长”值的长度。如果某个特定值的可打印表示需要不止M个字符,则显示完全 的值;不会将值截断以适合M个字符。

对每种浮点类型,可指定一个最大的显示尺寸M 和小数位数D。M 的值应该取1 到255。D的值可为0 到3 0,但是不应大于M - 2(如果熟悉ODBC 术语,就会知道M 和D 对应于ODBC 概念的“精度”和“小数点位数”)。M和D对FLOAT和DOUBLE 都是可选的,但对于DECIMAL是必须的。在选项M 和D时,如果省略了它们,则使用缺省值

2.2字符串列类型

MySQL基本使用_第4张图片
MySQL基本使用_第5张图片
L 以外所需的额外字节为存放该值的长度所需的字节数。MySQL 通过存储值的内容及其长度来处理可变长度的值。这些额外的字节是无符号整数。请注意,可变长类型的最大长度、此类型所需的额外字节数以及占用相同字节数的 无符号整数之间的对应关系。例如,MEDIUMBLOB 值可能最多224 - 1字节长并需要3 个字节记录其结果。3 个字节的整数类型MEDIUMINT 的最大无符号值为224 - 1。这并非偶然。

2.3日期时间列类型

MySQL基本使用_第6张图片
MySQL基本使用_第7张图片

举例

CREATE TABLE student
(
Name varchar(20) NOT NULL,
Chinese TINYINT(3),
Maths TINYINT(3),
English TINYINT(3),
Birthday DATE
)

怎么提高Mysql执行sql导入的速度

http://blog.csdn.net/sunboy_2050/article/details/5113483

Ubuntu下远程访问MySQL数据库

http://blog.csdn.net/sunboy_2050/article/details/6976148

你可能感兴趣的:(mysql,数据库,mysql)