mysql

chkconfig mysqld on 启动开机自动启动m’y
service mysqld start 启动服务
service mysqld status 查看状态
mysql -uroot -p 以root用户身份登录
show databases; 显示所有数据库
create database mydatabase; 创建新的数据库
use mydatabase; 进入新的数据库
show tables; 显示所在数据库的所有表
create table mytable(表头结构(name char(10),time DATE)); 创建表结构
(name varchar(20),pw varchar(20))
desc mytable; 显示表结构
insert into mytable(name,time)value(‘Tom’,‘19960430’); 在表中插入数据
select * from mytable; 查询表中的所有内容
select * from mytable limit 0,2;查询表中前两行内容
update mytable set time = “19970503” where name = “Tom”; 修改表中的数据
select * from mytable where name = “Tom”; 按行查询
select name from mytable; 按列查询
delete from mytable where name = “Tom”; 删除一条记录
drop table mytable; 删除表(一次可删除多个表)
drop database mydatabase; 删除数据库

面试的MySQL
SQL Server MySQL Oracle

什么是关系型数据库:里面存储的都是二维表,行称作记录,列称作字段/属性
都支持SQL(结构化查询语言)语句

NoSQL:非关系型数据库==》不支持SQL语句
如:redis memcached,存的都是键值对[key,value]

MySQL从初级==>中极
两本书
《MySQL入门很简单》
《深入浅出MySQL》

MySQL和文件
1.都在磁盘上存储,性能瓶颈,磁盘I/O上面
2.MySQL是支持SQL的,文件需要自己查询
3.MySQL支持并发操作,文件需要自己保证并发性
4.MySQL是C/S模型的,分布式起来非常简单
5.MySQL还支持索引,存储引擎

MySQL是一个C/S模型的系统
MySQL server运行起来
MySQL client==》组装发送SQL语句==》MySQL server来执行
MySQL server是基于TCP协议实现的
如果你的应用和 MySQL server
a.同一台电脑上通过共享内存实现的
b.不同电脑上通过socket实现的

MySQL server的服务器网络模块的源码:
I/O复用(select epoll)+多线程(对等于CPU的内核)的网络模型

1.SQL
《MySQL入门很简单》6,10,11章
MySQL博客链接:http://www.cnblogs.com/CareySon/archive/2010/02/16/1668803.html

实体与实体之间的关系:
一对一:人(id) 档案(userid)
如学生基本信息(父表user)和档案(子表info)之间,子表会有一个userid依附于父表的id
select * from info where userid = id;

多表联合查询 in查询,效率太低!!!
select * from user where id= 10;
select * from info where userid = 10;

链接查询(内连接查询,外连接查询[left join][right join])

内连接查询:
select * from user,info where user.id=info.userid and user.id=10;
select * from user inner join info on user.id=info.userid and user.id=10;
select * from table1 a inner join table2 b on a.id=b.userid where a.score>90.0;

一对多:学生(id) 成绩(stuid)
1 张三 20 男 1 1 数学 90.0
2 李四 22 女 2 1 语文 85.0
select * from student a inner join grade b on a.id=b.id where a.name=‘张三’ and b.score < 60.0;
//过滤条件

外连接查询:在子表里面添加一个字段(外键),对应父表的主键
左连接:left join 结果包含left这张表所有的信息,有些信息在right表中不存在,都填NULL值
select * from table1 a left join table2 b on a.id=b.userid
右连接:right join 结果包含left这张表所有的信息,有些信息在left表中不存在,都填NULL值
select * from table1 a right join table2 b on a.id=b.userid

多对多:增加中间表 2张表==》3张表
表设计的时候,遵守的范式越高,最终得到的表就越多,你再查询的时候,多表联合查询的效率》》》》单表查询—》甚至可能造成数据的查询效率太低了

用户
商品
订单
id
id
id
name
name
userid(int)
age
price
productid

amount

用户和订单:一个用户有多个订单,一个订单只有一个用户,一对多的关系
商品和订单:多对多

2.索引
3.SQL和索引的优化
MySQL的慢查询日志!!!(show variables like ‘long%’,查看超时时间)
用explain查看sql语句的执行计划,来分析sql的执行效率!!!

MySQL索引的底层实现原理:
哈希索引,无序查询,不使用于索引区间查找
B-树索引(MySQL使用的是B+树索引)

MySQL使用的是B+树索引,为什么?
    B-树存储索引结构有什么不好的地方?
    B-树存储索引的时候,每一个节点上不仅存储主键,还存储主键所在的这一行的数据地址
    B-树搜索的时候,每一条记录搜索的时间不平均
    B-树不适应于区间搜索

    索引用B+树存储,和B-树有什么区别?
    节点只存主键,不存数据结构了!!!节点可以存储更多的主键了
    B+树的所有的数据,都存在叶子节点上(id==》整行的数据都是存在叶子节点存储的),这样一来,所有用来记录搜索的时间花费,都是十分平均的
    使用额外的链表结构,把叶子节点所有的数据都用链表串起来了

    主键索引的B+树存储结构,叶子节点的存储信息都是 id=》整行的数据,都是在叶子节点上存储的。

4.SQL注入式错误
通过非法的SQL字符串拼接得到的SQL语句
select * from user where name=‘zhang san’ and password = ‘123456’;//正确姿势
1)string sql = “select * from user where name="; sql+=name;
不能保证name是正确的用户名
2)string sql = “select * from user where name = “+”’”+name+”’and passwd = “+”’”+pwd+’”;
3)select * from user where name=‘zhang san’ or 1=1
‘zhang san’ #
只知道用户名就可以登录进去
4)select * from user where name=‘zhang san’ or 1=1 and password = ‘123456’;
只知道密码便可以直接登录进去
解决:用带有预编译性质的SQL语句
对组装好的SQL语句把非法字符进行转义
要防止就不要用拼接式SQL语句

5.存储索引
B+树
MyISAM (user.frm user.MYD user.MYI)
InnoDB (user.frm user.ibd)
Memory 默认用的是哈希索引,都存储到内存中!

1.数据和索引存储的方式不相同
2.事务的支持不相同
3.索引的数据结构不相同
4.支持的锁的粒度不相同
5.外键(InnoDB)

6.索引的底层实现,主键自动生成索引
主键索引(叶子节点,存的是主键和对应的整行数据)
辅助索引(叶子节点,存的是该辅助字段值和对应的主键值)
区别在不同的引擎上:InnoDB都是聚集索引的(.ibd);MyISAM分聚集索引和非聚集索引(.MYD<地址> *.MYI<数据>)

聚集索引(索引和数据在一起存放)  id name age sex
非聚集索引(索引和数据不存在一起)  id addr

explain:查看SQL语句的执行过程(执行计划),经常用来分析SQL查询语句有没有用到索引,或者是有没有用到预期的索引

辅助索引:create index

主键索引:id:primary key ===》自动创建了主键索引(不能重复,一张表只能有一个主键)

唯一性索引:昵称:unique ==>自动创建唯一性索引(不能重复,但可以出现多个,即可以在多个列创建)
    create table user(id int primary key,name varchar(20) unique,arg int,sex enum('男','女'));

多列索引:(sex,age)
        注意:在使用多列索引必须包含最左侧的字段,也就是说,可以单独使用sex索引但不可以单独使用age索引
        select * from user where sex='女' and age between 18 and 22;

7.事务处理
事务就是一组sql语句的执行,要么都成功,要么都失败,不能出现部分成功,部分失败的场景

开启事务:一组sql语句的执行(如果sql执行过程中,出现错误,那么事务需要回滚)

提交事务

事务的ACID特性:
原子性:在一个事务进行的过程中,不能有另外的事务参与,事务执行要么成功,要么失败

一致性:并发操作数据库的时候,有可能导致数据的不一致性,由于并发操作,带来的事务处理过程中,数据的不一致性主要体现在以下三个方面:脏读(刚才读了之后,再读的时候没了),不可重复(数据一重复读可能另外的事务对其进行修改,导致数据不一致)和幻读
             为了解决以上的数据不一致性,数据库是怎么处理的呢?MySQL提供了事务的不同隔离级别

隔离性:事务的隔离性,主要就是解决数据的不一致性的问题
事务的隔离级别:
        1.未提交读:脏读,不可重复读和幻读都有可能发生    
        2.已提交读:不可重复读和幻读都有可能发生    
        3.可重复读:幻读有可能发生    
        4.串行化:脏读,不可重复读和幻读都不可能发生

事务的持久性:
保证数据一经持久化,就不会再引起任何数据丢失出错的问题!!!

多表链接查询,索引是怎么用的?
select * from table1 a
inner join
table2 b
on a.id=b.id
where b.score<60//过滤条件后选择小表进行索引
一个sql语句,只能用一次索引查询,看谁的行少,就用谁的索引
假如a表的记录少,那么直接拿b表的每一条记录的id在a表的id索引树上去查找就行了,所以a 控制了查询的时间,b 控制了查询的次数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值