mysql基础知识
1、mysql常见的引擎
MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE
现在大数据环境下,一般都使用Hive作离线查询,hue则是hive查询的一个接口界面,运营人员一般都通过hue去hive里查找相关数据。但是hive作为基于MR的产品,有其天生的缺陷:
1.hive不管查询多大的数据量都需要启动job。如果是查询少量数据,启动job的时间远远大于实际查询时间。换句话说,不管多大的数据量,hive基本不可能在秒级给出查询结果。
2.hive受限于Hadoop集群的计算资源。如果计算资源被占满,比如集群启动了某些大job,计算资源被占满,hive查询一直处于排队状态。这个时候运营人员会纷纷过来找RD,嚷嚷说为什么查了半天就是看不到结果。
3.hive属于sql的范式。对于非结构化的数据集,基本无能为力或者说很吃力。
因此在这种环境下,我们采用mysql+brighthouse的组合,能较好地解决这个问题。
brighthouse是infobright数据库的关键引擎。infobright 数据库是基于mysql的,它的设计主要是用于大规模的数据仓库和分析优化。开源社区版本可以免费试用。
brighthouse 是infobright 数据库的关键引擎。infobright 数据库是基于mysql的,它的设计主要是用于大规模的数据仓库和分析优化,brighthouse分为(企业版和社区版)
社区版的不支持insert,update,delete对数据操作和alter对结构操作,不支持高并发查询操作,数据存储高压缩一般为18:1,不能与MyISAM,InnoDB等引擎进行连接查询 , 数据必须使用LOAD 方式写入。
语法:
LOAD DATA INFILE 'filename' IGNORE INTO TABLE table_name CHARACTER SET utf8 FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n' (fields)
filename是要导入数据的源文件,后面中的 \t 是每个数据之间的间隔符,\n 是每条数据的间隔符,fields 是对应的字段列表。
2、mysql和mysqli的区别
mysql连接每当第二次使用的时候,都会重新打开一个新的进程,而mysqli则只使用同一个进程,这样可以很大程度的减轻服务器端压力。
其次,mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法
有些朋友在编程的时候,使用new mysqli(‘localhost’, usenamer’, ‘password’, ‘databasename’);总是报
错,Fatal error: Class ‘mysqli’ not found in d:\…
mysqli类不是php自带的吗?
不是默认开启的,win下要改php.ini,去掉php_mysqli.dll前的;,Linux下要把mysqli编译进去。
一:Mysqli.dll是一个允许以对象的方式或者过程操作数据库的,它的使用方式也很容易。
1、使用变量来代替mysql函数,以便读取mysql缓存
2、使用explain来分析sql语句是否使用了索引,explain关键字加在sql的最前面
3、经常用来搜索的字段建立索引
4、mysql修改密码:
set password for root@localhost = password('123');
mysqladmin -uroot -p123456 password 123
5、远程访问mysql
UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
flush privileges;
设置权限:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION;
6、因权限设置不当导致mysql的root看不到数据库的解决办法
1.关闭正在运行的MySQL服务。 net stop mysql
2.打开DOS窗口,转到mysql\bin目录。 mysql指的是安装mysql的目录,安装目录如果是xxx的话就转到xxx/bin
3.输入mysqld --skip-grant-tables 回车。 --skip-grant-tables 的意思是启动MySQL服务的时候跳过权限表认证,网上说输入的是mysqld_safe但我输入mysqld也可以
4.再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),输入mysql回车,如果成功,将出现MySQL提示符 >。
5.连接权限数据库:use mysql; 。
6.改密码:update user set password=password("root") where user="root";(别忘了最后加分号) 。 password括号里的root指的是新修改的密码,如果密码想设置成xxx就写成password("xxx")
7.刷新权限(必须步骤):flush privileges;。
8.退出quit。
9.再开一个DOS窗口,启动mysql服务,使用用户名root和刚才设置的新密码root登录就ok了。 net start mysql
7、远程连接数据库,如果无法连接
1,ping 192.168.1.211,如果不可以就是网络问题
2,检查端口是否被防火墙挡住了,telnet 192.168.1.211 3306,如果连接失败,配置防火墙。
3,vi /etc/sysconfig/iptables
打开加上这句 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT(允许3306端口通过防火墙)
/etc/init.d/iptables restart(重启防火墙使配置生效)
4, 1.检查MySQL配置
如果开启了防火墙,telnet还是失败,通过netstat查看3306的端口状态:
netstat -apn|grep 3306
tcp6 0 0 127.0.0.1:3306 :::* LISTEN 13524/mysqld
grant Select,Insert,Update privileges on mysqltest.* to 'mysqltest'@'localhost' identified by 'mysqltestmima123';
8、mysql和mongodb的区别
8.1
a.mysql是关系型数据库,mongodb是非关系型数据库
b.mysql是分不同的引擎有不同的存储方式,mongodb是用虚拟内存+持久化存储
c.mongdb是基于内存,可以将热数据放于内存中,实现高可用,高速读写
d.mongodb自身不带事务机制,如果需要可以增加一个额外的表,进行逻辑实现
9、垂直分表和水平分表
9.1
垂直分库:两项单独的数据,没有关联,就可以垂直分表,比如qq的说说数据和留言数据
水平分库:当某一项数据达到某一个量时,按照规则来区分就可以水平分库,比如id为奇数的存在A库,id为偶数的存在B库,一般水平分库是在垂直分库之后的
水平分库需要解决的问题:数据路由、组装。
读写分离:当数据量达到一个顶值时,可以允许存在一定时间延迟的,主要问题是数据同步的问题。
10、编码
ALTER TABLE `test` DEFAULT CHARACTER SET utf8;该命令用于将表test的编码方式改为utf8;
ALTER TABLE `test` CHANGE `name` `name` VARCHAR(36) CHARACTER SET utf8 NOT NULL; 该命令用于将表test中name字段的编码方式改为utf8
show variables like 'character%';
SET character_set_server = utf8;
11、mysql source 命令导入大的sql文件的方法
在mysql的安装目录下 找到 my.ini文件 加入以下代码:
interactive_timeout = 120
wait_timeout = 120
max_allowed_packet = 32M
12、mysql分组出最新的一条记录
select * from (select * from log_login order by logout_time desc) as a group by rid, srv_id order by logout_time desc
13、mysql截取字符串并对字符串进行排序
SELECT cast(substring_index(memo, '|',-1) as unsigned) as memo FROM logs ORDER BY memo DESC;
14、mysql获取某字段值首字符等于monthcard字符的sql:
SELECT * FROM mod_charge WHERE LOCATE('monthcard', sn) = 1;
这样效率不高,虽然用到了索引:SELECT * FROM mod_charge WHERE sn NOT LIKE 'monthcard%';
这样效率是最慢的,没用到索引:LIKE ‘%monthcard%’
LOCATE('monthcard', sn)返回monthcard第一次出现的位置