源码编译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 --list mysqld

启动服务

    #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

找到相关内容位置

源码编译mysql及其各种查询总结

添加后:

   $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>use hellodb    #切换到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 classid having countname> =2;

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

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


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

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

如果降序排列:

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

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

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


DISTINCT 对显示的值只显示一次


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

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


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

   mysql> select classid,min(age) from students group by classid;

   mysql> select classid,min(age) from students group by classid having minage< 20;

如果还需要排序在后面添加order by minage


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

   mysql> select gender,sum(age) from students group by gender order by sumagedesc;

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

   mysql> select age,countname) from students group by age;


内联结:自然联结

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

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


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

左外联结

mysql> select name,class from students left join classes on students.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;



事务:ACID   innodb支持事务

ACIDI: 隔离性

事务有隔离级别:

   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_name default (属性) 修改属性

  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




本文转自 宋鹏超 51CTO博客,原文链接:http://blog.51cto.com/qidian510/1291933,如需转载请自行联系原作者

上一篇:MySQL - InnoDB特性 - Buffer Pool漫谈


下一篇:Scriptcase价格调整(五折销售)