设为首页 加入收藏

TOP

Mysql原理,命令,及技巧总结(四)
2014-11-24 03:18:41 来源: 作者: 【 】 浏览:16
Tags:Mysql 原理 命令 技巧 总结

(2) 查找重复的,并且除掉最小的那个
delete tb_person as a from tb_person as a,
(
   select *,min(id) from tb_person group by name having count(1) > 1
) as b
where a.name = b.name and a.id > b.id;

MySql explain优化SQL语句
在mysql version 4.1中,explain输出的结果格式改变了,使得它更适合例如 union语句、子查询以及派生表的结构。更令人注意的是,它新增了2个字段: id和 select_type。当你使用早于mysql4.1的版本就看不到这些字段了。
explain结果的每行记录显示了每个表的相关信息,每行记录都包含以下几个字段:
(1) id : 本次 select 的标识符。在查询中每个 select都有一个顺序的数值。
(2) select_type:select 的类型,可能会有以下几种:
A. simple: 简单的 select (没有使用 union或子查询)
B. primary: 最外层的 select。
C. union: 第二层,在select 之后使用了 union。
D. dependent union: union 语句中的第二个select,依赖于外部子查询
E. subquery: 子查询中的第一个 select
F. dependent subquery: 子查询中的第一个 subquery依赖于外部的子查询
G. derived: 派生表 select(from子句中的子查询)
(3) table:记录查询引用的表。
(4) type:表连接类型。以下列出了各种不同类型的表连接,依次是从最好的到最差的:
A. system: 表只有一行记录(等于系统表)。这是 const表连接类型的一个特例。
B. const: 表中最多只有一行匹配的记录,它在查询一开始的时候就会被读取出来。由于只有一行记录,在余下的优化程序里该行记录的字段值可以被当作是一个恒定值。const表查询起来非常快,因为只要读取一次!const用于在和 primary key或unique索引中有固定值比较的情形。下面的几个查询中,tbl_name 就是 c表了:
select * from tbl_name where primary_key=1; select * from tbl_name whereprimary_key_part1=1 and primary_key_part2=2;

C. eq_ref: 从该表中会有一行记录被读取出来以和从前一个表中读取出来的记录做联合。与const类型不同的是,这是最好的连接类型。它用在索引所有部分都用于做连接并且这个索引是一个primary key或 unique类型。eq_ref可以用于在进行"="做比较时检索字段。比较的值可以是固定值或者是表达式,表达式中可以使用表里的字段,它们在读表之前已经准备好 了。以下的两个例子中,mysql使用了eq_ref 连接来处理
ref_table:(1)select * from ref_table,other_table where ref_table.key_column=other_table.column;(2)select * from ref_table,other_tablewhere ref_table.key_column_part1=other_table.column and ref_table.key_column_part2=1;

D. ref: 该表中所有符合检索值的记录都会被取出来和从上一个表中取出来的记录作联合。ref用于连接程序使用键的最左前缀或者是该键不是 primary key或 unique索引(换句话说,就是连接程序无法根据键值只取得一条记录)的情况。当根据键值只查询到少数几条匹配的记录时,这就是一个不错的连接类型。ref还可以用于检索字段使用 =操作符来比较的时候。以下的几个例子中,mysql将使用 ref 来处理
ref_table:(1) select * from ref_table wherekey_column=expr; (2) select * from ref_table,other_table where ref_table.key_column=other_table.column; (3) select * fromref_table,other_tablewhereref_table.key_column_part1=other_table.columnandref_table.key_column_part2=1;

E. ref_or_null: 这种连接类型类似 ref,不同的是mysql会在检索的时候额外的搜索包含null值的记录。这种连接类型的优化是从mysql4.1.1开始的,它经常用于子查询。在以下的例子中,mysql使用ref_or_null 类型来处理 ref_table:select * from ref_table wherekey_column=expr or key_column is null;
F. unique_subquery: 只是用来完全替换子查询的索引查找函数效率更高了,这种类型用例如一下形式的 in 子查询来替换ref:value in(select primary_key from single_table where some_expr)
G. Index_subquery: 这种连接类型类似 unique_subquery。它用子查询来代替in,不过它用于在子查询中没有唯一索引的情况下,例如以下形式:value in (select key_column from single_table where some_expr)
H. range: 只有在给定范围的记录才会被取出来,利用索引来取得一条记录。key字段表示使用了哪个索引。 key_len字段包括了使用的键的最长部分。这种类型时 ref 字段值是 null。range用于将某个字段和一个定植用以下任何操作符比较时 =, <>, >,>=,<, <=, is null, <=>, between, 或 in:select * from tbl_name where key_column = 10; select * fromtbl_namewhere key_column between 10 and 20; select * from tbl_namewhere key_column in(10,20,30); select * from tbl_name wherekey_part1= 10 and key_part2 in(10,20,30);
I. index: 连接类型跟 all 一样,不同的是它只扫描索引树。它通常会比 all快点,因为索引文件通常比数据文件小。mysql在查询的字段知识单独的索引的一部分的情况下使用这种连接类型。
J. all: 将对该表做全部扫描以和从前一个表中取得的记录作联合。这时候如果第一个表没有被标识为const的话就不大好了,在其他情况下通常是非常糟糕的。正常地,可以通过增
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 4/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇搞定MySQL数据库中文模糊检索问题 下一篇MySQL数据库的其它安全问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·工业机器人TCP校准中 (2025-12-25 05:19:17)
·opc 通讯协议与 TCP (2025-12-25 05:19:15)
·labview中tcp/ip通信 (2025-12-25 05:19:13)
·新书介绍《Python数 (2025-12-25 04:49:47)
·怎么利用 Python 进 (2025-12-25 04:49:45)