怎么查看MySQL 源码编译了什么_源码编译mysql及其各种查询总结

一、编译安装配置及相关参数设定

确保安装了编译环境所需要的包组

安装“Development tools”和“Server Platform Development”包组

1、安装cmake

cmake-2.8.8.tar.gz

跨平台编译器

# tar xf cmake-2.8.8.tar.gz

# cd cmake-2.8.8

# ./bootstrap

# make

# make install

2、编译安装

逻辑卷挂载到/mydata目录下

#mkdir /mydata/data

# tar xf mysql-5.5.33.tar.gz

# cd mysql-5.5.33

# groupadd -r mysql

# useradd -g mysql -r -d /data/mydata mysql

# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \#cmake的安装路径

-DMYSQL_DATADIR=/mydata/data \#数据目录

-DSYSCONFDIR=/etc \#配置文件路径

-DWITH_INNOBASE_STORAGE_ENGINE=1 \  #编译INNOBASE存储引擎

-DWITH_ARCHIVE_STORAGE_ENGINE=1 \ #编译ARCHIVE存储引擎,支持压缩的归档引擎

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ #编译BLACKHOLE存储引擎

-DWITH_READLINE=1 \   #数据导入导出功能  批量数据导入

-DWITH_SSL=system \#ssl路径

-DWITH_ZLIB=system \#网络传输时,可以进行压缩

-DWITH_LIBWRAP=0 \   #是否接受tcprap通知

-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \#UNIX进程间通信的地址

-DDEFAULT_CHARSET=utf8 \#默认字符集

-DDEFAULT_COLLATION=utf8_general_ci#默认排序规则

# make

# make install

#chown -R root:mysql /usr/local/mysql/*

#cd/usr/local/mysql/

#cd mysql/support-files有样例,我们可以根据自己的需要选择

将选择的文件复制一份到/etc/目录下并修改文件名为my.cnf

#cp my-large.cnf /etc/my.cnf

3:修改配置文件

# vim /etc/my.cnf

找到相关设置进行修改操作

thread_concurrency = 4并发核心数, 如果物理核心为2,这里就可以填写4

添加 datadir=/mydata/data

innodb_file_per_table = 1#每表一个表空间

初始化脚本

#cd /usr/local/mysql/

#scripts/mysql_install_db --user=mysql --datadir=/mydata/data/

服务脚本

#cp mysql.server /etc/rc.d/init.d/mysqld

添加mysql服务

#chkconfig --add mysqld

验证一下

#chkconfig --listmysqld

启动服务

#service mysqld start

这时候还不能连接客户端

# vim /etc/profile.d/mysql.sh

export PATH=/usr/local/mysql/bin:$PATH

执行脚本

# . /etc/profile.d/mysql.sh

#mysql就可以进入了

因为我们的安装不在标准路径下,所以还要进行下面的操作

导出帮助文件

#vim /etc/man.config

MANPATH /usr/local/mysql/man

导出头文件

#ln -sv /usr/local/mysql/include /usr/local/mysql

导出库文件

#vim /etc/ld.so.conf.d/mysql.conf

/usr/local/mysql/lib

至此我们的mysql配置完成。

mysql> show processlist;#显示当前mysql服务器所有的线程列表

mysql>use mysql;#切换到mysql库

mysql> show tables;#显示所有表

mysql> desc user;#显示user表的结构

mysql> show indexes from user;#主键

mysql> select user,host,password from user;#显示user表的user,host,password信息

删除没密码的用户

mysql>  drop user ''@localhost;

mysql>  drop user ''@localhost.localdomain;

再次查看有哪些用户

mysql>  select user,host,password from user;

将没有用户名的都删除,将保留需要的root用户名的要添加密码以保证安全性

给所有的root用户设定的密码为mypass

mysql> update user set password=PASSWORD('mypass')where user='root';

生效后刷新授权表

mysql>flush privileges;

退出后重新登陆时就需要密码了

修改用户密码:

1、# mysqladmin -uUSERNAME -hHOST  password 'new_pass';

2、mysql> SET PASSWORD FOR username@host=PASSWORD('new_pass');

3、mysql.user

mysql> UPDATE user SET password=PASSWORD('new_pass') WHERE user='root';

如果忘记root用户密码:

修改/etc/rc.d/init.d/mysqld

启动选项:--skip-grant --skip-networking

找到相关内容位置

5cbc7300c6d7dbde52195cb68f43cbb8.png

添加后:

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args --skip-grant --skip-networ>/dev/null 2>&1 &

注意:我们登入后重新设定密码后要将这一项再去掉

二、分组的相关用法

导入一个数据库

#mysql -uroot -p < hellodb

mysql>usehellodb    #切换到hellodb库

显示students表中的所有内容

mysql> select * from students;

以classid分组,显示每个classid对应有多少人

mysql> select classid,count(name) from students group by classid;

显示classid对应的人数大于等于2的有哪些

mysql> select classid,count(name) from students group by classidhaving count(name)> =2;

可以使用别名对上面的进行修改,如下:

mysql> select classid,count(name)as cfrom students group by classidhaving c >=2;

对年龄进行排序(默认为升序)

mysql> select name,age from students order by age;

如果降序排列:

mysql> select name,age from students order by agedesc;

对降序得到的只显示某些的

mysql> select name,age from students order by agedesc limit 3 4;空过3个后显示4个

DISTINCT 对显示的值只显示一次

以性别分组,显示各组年龄中的最大值;

mysql> select gender,max(age) from students group by gender;

以班级分组,显示各组年龄中的最小值;只显示最小年龄小于20的班级;

mysql> selectclassid,min(age) from students group byclassid;

mysql> selectclassid,min(age) from students group byclassid having min(age)< 20;

如果还需要排序在后面添加order by min(age)

以性别分组,显示各组年龄的年龄之和,要求将年龄之和逆序排列;

mysql> select gender,sum(age) from students group by genderorder by sum(age)desc;

以年龄分组,显示各组中的人数;

mysql> selectage,count(name) from students group byage;

内联结:自然联结

显示两张表classid相等的同学的信息

mysql> select * from students,classes where students.classid = classes.classid;

外联结:一张表与另外一张表对应的值,如果没有,就显示null

左外联结

mysql> selectname,classfrom studentsleft joinclassesonstudents.classid = classes.classid;

右外联结

RIGHT JOIN ... ON ...

自联结:sometable AS alias1 INNER JOIN sometable AS aliase2 ON alias1.FILED = alias2.FIELD;

mysql> select s.name as student,t.name as teacher from students as s inner join students as t where s.teacherid=t.stuid;

对同一张表设定两个别名来实现自联结

联合查询:将两张表的结果组合起来,形成一个新的表

SELECT clause UNION SELECT clause

显示teachers表中年龄大于50岁的和students表中年龄大于40岁的姓名和年龄的信息,并且在一张表显示

mysql> select name,age from teachers where age > 50 union select name,age from students where age > 40;

多表联合的查询 :将每两张表表示信息相同部分的查找字段作为联合查询的依据

mysql> select name,course from students,classes,coc,courses where students.classid=classes.classid and classes.classid=coc.classid and coc.courseid=courses.courseid and students.name='Ding Dian';

这个命令可以简单写:

mysql> select name,course from students,coc,courses where students.classid=coc.classid and coc.courseid=courses.courseid and students.name='Ding Dian';

练习、如何显示其年龄大于平均年龄的同学的名字?

mysql> select name,age from students where age > (select avg(age) from students);

子查询:

用于WHERE子句

SELECT clause FROM tb1 WHERE

1、用于比较表达式中的子查询;

2、用于EXISTS中的子查询;

3、用于IN中的子查询;

用于FROM中的子查询

SELECT col,... FROM (SELECT clause) WHERE condition

据说:MySQL对子查询的优化很有限;

MySQL查询:

简单查询

SELECT [DISTINCT] col, col,... FROM tb1 WHERE condition GROUP BY col HAVING condition ORDER BY col LIMIT [m,]n;

子查询:

WHERE:

用于比较条件:子查询只能返回单个值

用于IN

找出学了不存在课程的班级

mysql> select classid from coc where courseid not in (select courseid from courses);

用于EXISTS

FROM:

显示班级里面有大于平均年龄的同学所在的班级

mysql> select classid,count(name) from students where classid is not null and age > (select avg(age) from students) group by classid;

事务:ACIDinnodb支持事务

ACID:I: 隔离性

事务有隔离级别:

READ-UNCOMMITTED读未提交   (别人修改的尚未提交的数据自己能看到)

READ-COMMITTED读提交         (别人修改的提交的数据自己能看到)

REPEATABLE-READ重读级别(不受别人影响)

SERIALIZABLE可串行化            (同时查询的情况一方不能修改)

MVCC: Multi Version Concurrency Control

#sql_log_bin

# mysqlbinlog

三、Mysql基础命令用法

DDL:

数据库:

创建:

CREATE DATABASE|SCHEMA  [IF NOT EXISTS] dbname;

CHARACTER SET=定义字符集

COLLATE=定义排序规则

SCHEMA方案

删除:

DROP DATABASE|SCHEMA [IF EXISTS] dbname;

[IF EXISTS]避免调用时报错

获取帮助:HELP SQL KEYWORD

修改:

ALTER DATABASE db_namedefault (属性) 修改属性

ALTER {DATABASE | SCHEMA} db_name

UPGRADE DATA DIRECTORY NAME升级数据库字典

表:

创建:

CREATE TABLE tb_name (col1 defination, col2 defination, ...) [table_options];

table options:

ENGINE=engine定义存储引擎

查看默认存储引擎:

#mysql> show session variables like '%engine%';

DELAY_KEY_WRITE={0|1}#是否延迟键写入

TABLESPACE tablespace_name#表空间文件

CREATE TABLE tbname [(defination)]  SELECT clause;

CREATE TABLE tbname LIKE old_table_name;

mysql> create table tb2(id INT not null,name CHAR(24),INDEX(id));I#创建tb2,

mysql> show indexes from tb2\G显示tb2的索引

mysql> create table tb4 like tb3; #复制和tb3相同的表tb4的结构,但是不复制其内容

mysql> create table tb3 select user,host,password from mysql.user; 复制全部数据,但是表的结构不一定会完全复制

所以,将上述两个命令结合起来就能够使表的结构和数据一起被复制了。

存储引擎:也称作表类型

MyISAM表:

tbname.MYD表的数据

tbname.MYI表的索引

Tbname.frm表的定义

表空间:ibdata1

每表一个表空间:

tbname.frm表的定义

tbname.ibd: 数据和索引

开启方法:

SET GLOBAL innodb_file_per_table=1;实现每表一个表空间

建议:同一个库中的表最好使用相同的存储引擎;

删除:DROP TABLE [IF EXISTS] tbname;

改名:RENAME TABLE tb_name TO new_name;

修改:ALTER TABLE tbname

ADD col defination [{first|after col_name}] ;

DROP colname;

MODIFY col defination [{first|after col_name}] ;#修改小部分内容

CHANGE col new_col_name defination [{first|after col_name}] ;#修改大的内容

RENAME TO new_name;

练习题:

1、新增字段:

Class 字段定义自行选择;放置于Name字段后;

mysql> alter table tb1 add class INT not null after name;

mysql> alter table tb1 modify class INT not null first; 调整Class字段为第一

2、将ID字段名称修改为TID;

mysql> alter table tb1 change ID TID INT UNSIGNED not null;

3、将Age字段放置

例如:mysql> create table tb1(name CHAR(10) not null,age TINYINT UNSIGNED);

mysql> desc tb1;  描述表tb1的结构

mysql> show table status\G  查看默认存储引擎是什么

DML: insert, update, delete

INSERT INTO tb_name [(col1,col2,...)] {VALUE|VALUES} ();

INSERT INTO tb_name SET col1=value,...;

INSERT INTO tb_name(col1,...) SELECT clause;

从另外的表检索数据添加到新表中

mysql> insert into tb2 set name=‘ling chon’,age=34;

把执行过程分成两段:CREATE LIKE,INSERT INTO SELECT

mysql> create table tb2like tb1;

mysql> insert into tb2()select ID Name Age Gender Course from tb1;

REPLACE INTO:替换操作;源数据存在就修改,不存在就添加

mysql> select last_insert_id();

查看最后一次插入数据的id号

mysql> insert into tb1 values (1,'Ling Huchong',24,'Male','Huashan');

修改:UPDATE

WHERE clause

LIMIT n     限制前n个用户修改

mysql> update tb1 set age=34;  会将所用的全部修改为34

mysql> update tb1 set age=34 where name=‘lin shen’;

删除:mysql> DELETE FROM tb_name where id=‘4’;

如果id号设置为自动增长,删除第四个后,新添加一个新的id会空过4的,新的id号为5

清空并重置表:清空后,id号从1开始

mysql> TRUNCATE TABLE tb_name‍‍‍

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值