在命令行下以root用户进MySQL数据库的命令如下:
mysql -h127.0.0.1 -P3306 -uroot -p
然后输入密码再敲入回车键进入MySQL控制台。每一条MySQL数据库查询语句均要以英文分号结尾回车查询(或\G)。
以下基础的MySQL命令中,设计了一个名为bash的数据库,一个cmd_info的表,表中包括一些列名。其中中括号[]内的表示可选参数。
列出mysql的所有数据库:
show databases;
使用bash数据库:
use bash;
列出bash数据库的所有数据表:
show tables [from bash];
列出bash数据库的所有数据表(提供比较详细的信息):
show table status [from bash];
列出数据表cmd_info所有的列(提供比较详细的信息,等价于:desc cmd_info):
show full columns from cmd_info [from bash];
或
show full fields from cmd_info [from bash];
查询数据表cmd_info的总记录条数:
select count(*) from cmd_info;
查询数据表cmd_info的所有数据:
select * from cmd_info;
查询数据表cmd_info的前10条数据:
select * from cmd_info limit 10;
列出数据表cmd_info的索引信息:
show index from cmd_info [from bash];
列出mysql的当前状态:
status;
show status;
列出mysql系统变量:
show variables;
显示正在运行命令的mysql用户清单:
show process list;
退出mysql控制台:
quit
获取当前用户的权限信息:
show grants [for root@localhost];
记录一些select的技巧,比如如何用 in、limit、concat、distinct 等MySQL关键字:
1、select语句可以用回车分隔
$sql="select * from article where id=1" 和 $sql="select * from article where id=1",都可以得到正确的结果,但有时分开写或许能更明了一点,特别是当sql语句比较长时。
2、批量查询数据
可以用in来实现 $sql="select * from article where id in (1,3,5)"
3、使用concat连接查询的结果
$sql="select concat(id,"-",con) as res from article where id=1" 返回"1-article content"
4、使用locate
用法:select locate("hello","hello baby"); 存在返回1,不存在返回0
5、使用group by
以前一直没怎么搞明group by 和 order by,其实也满简单的,group by 是把相同的结果编为一组,比如:$sql="select city, count(*) from customer group by city"; 这句话的意思就是从customer表里列出所有不重复的城市,及其数量(有点类似distinct) group by 经常与 AVG(),MIN(),MAX(),SUM(),COUNT() 一起使用
6、使用having
having 允许有条件地聚合数据为组 $sql="select city,count(*),min(birth_day) from customer group by city having count(*)>10"; 这句话是先按city归组,然后找出city地数量大于10的城市 btw:使用group by + having 速度有点慢 同时having子句包含的表达式必须在之前出现过
7、组合子句
where、group by、having、order by(如果这四个都要使用的话,一般按这个顺序排列)
8、使用distinct
distinct是去掉重复值用的 $sql="select distinct(city) from customer order by id desc"; 这句话的意思就是从customer表中查询所有的不重复的city
9、使用limit
如果要显示某条记录之后的所有记录 $sql="select * from article limit 100,-1";
10、多表查询
$sql="select user_name from user u, member m where u.id=m.id and m.reg_date>=2006-12-28 order by u.id desc;" 注意:如果user和member两个表同时有user_name字段,会出现mysql错误(因为mysql不知道你到底要查询哪个表里的user_name),必须指明是哪个表的。
MySQL的limit查询优化
通过具体的案例来说明,这里是对同一张表在不同的地方取10条数据:
(1)offset比较小的时候
select * from user limit 10,10; 这条SQL语句多次运行,时间保持在0.0004-0.0005之间。 select * From user Where uid >=( select uid From user Order By uid limit 10,1 ) limit 10; 这条SQL语句多次运行,时间保持在0.0005-0.0006之间,主要是0.0006。
结论:偏移offset较小的时候,直接使用limit较优。这个显然是子查询的原因。
(2)offset大的时候
select * from user limit 10000,10; 这条SQL语句多次运行,时间保持在0.0187左右 select * From user Where uid >=( select uid From user Order By uid limit 10000,1 ) limit 10; 这条SQL语句多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。
总结:使用limit语句时,当数据量偏移量较小的时候可以直接使用limit,当数据量偏移量较大的时候,我们可以适当的使用子查询来做相关的性能优化。
====
一些MySQL语句:
mysql> show variables like '%skip_networking%'; mysql> show variables like 'collation_%'; mysql> show variables like 'char_%'; use db_name; status; #查看某个数据库的编码 show create database db_name; #查看某个数据库的编码 show [global] status; show variables; show engines; show grants; #查看权限分配情况 show columns from db_name.tb_name; <=> desc db_name.tb_name show create table db_name.tb_name\G #注意最后用的是"\G"而不是";"
在MySQL中需要删除表中特定的记录,可用 WHERE 子句来选择所要删除的记录。这类似于 SELECT 语句中的 WHERE 子句。
mysql> delete from pet where name="Whistler";
可以用下面的语句清空整个表:
mysql> delete from pet;
truncate命令的语法结构为:
TRUNCATE [TABLE] tbl_name;
这里简单的给出个示例,我想删除 friends 表中所有的记录,可以使用如下语句:
truncate table friends;
truncate 和 delete的效率问题:
如果想要删除表的所有数据,truncate语句要比 delete 语句快。因为 truncate 删除了表,然后根据表结构重新建立它,而 delete 删除的是记录,并没有尝试去修改表。这也是为什么当向一个使用 delete 清空的表插入数据时,MySQL 会记住前面产生的AUTOINCREMENT序列,并且继续利用它对AUTOINCREMENT字段编号。而truncate删除表后,表是从1开始为autoincrement字段编号。不过truncate命令快是快,却不像delete命令那样对事务处理是安全的。
====
show variables like "plugin%"; #查看插件库路径 select @@basedir; /* system_user() 系统用户名 user() 用户名 current_user 当前用户名 session_user()连接数据库的用户名 database() 数据库名 version() MYSQL数据库版本 load_file() MYSQL读取本地文件的函数 @@datadir 读取数据库路径 @@basedir MYSQL 安装路径 @@version_compile_os 操作系统 */ select Host,User,Password from mysql.user; select * from mysql.func;
参考链接:
=END=
《 “MySQL数据库的基本操作-学习” 》 有 7 条评论
MySQL中的多行注释
http://stackoverflow.com/questions/728172/are-there-multiline-comment-delimiters-in-sql-that-are-vendor-agnostic
/*
multi-line comment here
*/
`delete from db_name.tbl_name [where …];
DROP AND CREATE
TRUNCATE TABLE db_name.tbl_name;
`
浅谈 mysql 删除或清空表的数据
http://github.tiankonguse.com/blog/2015/01/10/mysql-delete-data.html
MySQL 学习笔记
http://notes.diguage.com/mysql/
优化 | 再用传统分页SQL你就死定了
http://blog.csdn.net/yejr/article/details/70039403
MySql 日常指导,及大表优化思路
https://juejin.im/post/5b7d52afe51d453885030b91
`
除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在千万级以下,字符串为主的表在五百万以下是没有太大问题的。
而事实上很多时候 MySQL 单表的性能依然有不少优化空间,甚至能正常支撑千万级以上的数据量。
单表优化
字段
索引
查询SQL
引擎
MyISAM
InnoDB
系统调优参数
升级硬件
读写分离
缓存
表分区
分区的好处是:
分区的限制和缺点:
分区的类型:
分区适合的场景有:
垂直拆分
垂直拆分的优点是:
缺点是:
水平拆分
水平拆分的优点是:
缺点是:
分片原则
解决方案
客户端架构
客户端架构的优点是:
缺点是:
代理架构
代理架构的优点是:
缺点是:
各方案比较
兼容 MySQL 且可水平扩展的数据库
NoSQL
`
SQL中根据多个字段进行group by分组
https://stackoverflow.com/questions/2421388/using-group-by-on-multiple-columns
`
Group By X means put all those with the same value for X in the one group.
Group By X, Y means put all those with the same values for both X and Y in the one group.
`
SQL中根据多个字段进行order by排序
https://stackoverflow.com/questions/2051162/sql-multiple-column-ordering
`
ORDER BY column1, column2 DESC #根据 column1,column2 进行逆序排列
ORDER BY column1 DESC, column2 ASC #根据 column1 进行逆序, column2 进行升序排列
`