MySQL的几个细节小问题
(本文章里,centos的系统命令用斜杠加粗来表示,以便各位阅读~)
Centos里,Mysql是5.1版本的话,那么需要使用#service mysqld start来启动服务,然后才能进入mysql的界面,而升级成5.5版本之后,命令改成#service mysql start。至于在linux下怎么装mysql,直接看http://lnmp.org/install.html就行,这个是装Nginx的,里面直接就顺带安装了mysql5.5。
还有输入命令就提示“ignoring query to other database”,这个问题就是在 “mysql -u用户名 -p”的时候,没有打那个u。
下面说点有营养的,在MySQL里建立一个表1,起名叫A,只有一个列叫“ID”,里面有三个值,分别是"1""2"和NULL,注意,这里是null,而不是"null",如果是"null",那么输入的其实是0.效果图如下:
可见a表里的元素是1 2 3 null,可是count(*)和count(id)得出的结论却不是一样的值,由此可见,count(id) 更加精准,因为他不包括null。
我们继续,如果再建立一个b表,里面有一个列叫b_id,有两个元素,全是1,现在打算“显示a表中里与b表id一样的数”,有两种表达方法,一种是子查询,一种是join查询,一般来说都使用join查询,join语句比较好写,效果如下图。
第一次用了子查询,返回一个“1”,第二次用了join语句,返回了两个“1”,也就是说出现了一对多的情况,这种情况要在join前加上DISTINCT来取消重复项。
假设服务器里有一个较庞大的表,每一次SELECT都会舟车劳顿,于是在EXPLAIN SELECT一下是一个好办法,例子中的表结构如下图:
LIMIT 50,5是从51开始,到55结束,不包含50!
一个只扫描了55行,一个却扫描了953行外加使用了额外步骤,于是可见,优化limit查询,主旨就是尽可能少的扫描数据,所以能用主键就用主键。我这里的例子只是从50行开始,如果是在生产中,表里几万行乃至几十万行的数据,主键的扫描优势非常明显。
还没完,如果我们不怕累,再多打几个字。
SELECT film_id,description,title FROM sakila.film WHERE film_id >55 and film_id <=60 ORDER BY title LIMIT 0,5 \G
看看这个命令的EXPLAIN,扫描数字更喜人~LIMIT 0,5不是1,5;要是1的话,开头是第57。这里要小心!
重点放后面,这个用法主要用于一马平川的主键数据表,中间主键不可以用空挡,意味着这个表里不可以有过DROP记录,不然的话,会出现真的空档。
本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/1734817