mysql常见的系统瓶颈

 

  1. 磁盘搜索。需要花时间从磁盘上找到一个数据,用在现代磁盘的平均时间通常小于10ms,因此理论上我们能够每秒大约搜索1000次。这个时间在新磁盘上提高不大并且很难为一个表进行优化。优化它的方法是将数据分布在多个磁盘上。
  2. 磁盘读/写。当磁盘放入正确位置后,我们需要从中读取数据。对于现代的磁盘,一个磁盘至少传输10-20Mb/s的吞吐。这比搜索要容易优化,因为你能从多个磁盘并行地读。
  3. CPU周期。我们将数据读入内存后,需要对它进行处理以获得我们需要的结果。表相对于内存较小是最常见的限制因素。但是对于小表,速度通常不成问题。
  4. 内存带宽。当CPU需要的数据超出CPU缓存时,主缓存带宽就成为内存的一个瓶颈

MongoDB 的几种操作符

条件操作符:

  • (>) 大于 – $gt
  • (<) 小于 – $lt
  • (>=) 大于等于 – $gte
  • (<= ) 小于等于 – $lte

类似于SQL语句:

类似于SQL语句:


$type操作符:筛选出某种类型的数据来

$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果。

MongoDB 中可以使用的类型如下表所示:

类型 数字 备注
Double 1
String 2
Object 3
Array 4
Binary data 5
Undefined 6 已废弃。
Object id 7
Boolean 8
Date 9
Null 10
Regular Expression 11
JavaScript 13
Symbol 14
JavaScript (with scope) 15
32-bit integer 16
Timestamp 17
64-bit integer 18
Min key 255 Query with -1.
Max key 127

如果想获取 “col” 集合中 title 为 String 的数据,你可以使用以下命令:

 

MongoDB的查询、修改、删除条件

MongoDB 与 RDBMS Where 语句比较

如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:

操作 格式 范例 RDBMS中的类似语句
等于 {<key>:<value>} db.col.find({"by":"AAA"}).pretty() where by = 'AAA'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件。

语法格式如下:

MongoDB OR 条件

MongoDB OR 条件语句使用了关键字 $or,语法格式如下:

AND 和 OR 联合使用

以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘AAA’ OR title = ‘MongoDB 教程’)’

 

MongoDB的增删改查

  1. 增加数据库:直接use database,如果没有此数据库就直接创建
  2. 查看当前用的是什么数据库:>db
  3. 数据库删除:db.database.drop()
  4. 文档增加:db.database.insert({“数据key”:”数据value”})
  5. 文档删除:
    2.6版本以前
    db.database.remove(
    <query>,
    <justOne>
    )
    2.6版本以后
    db.database.remove(
    <query>,
    {
    justOne: <boolean>,
    writeConcern: <document>
    }
    )
    参数说明:
    query :(可选)删除的文档的条件。
    justOne : (可选)如果设为 true 或 1,则只删除一个文档。
    writeConcern :(可选)抛出异常的级别。
  6. 文档查询:db.database.find()如果想直观的观看数据可在后边加一个 pretty(),db.database.find().pretty()
  7. 文档修改:
    db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
    参数说明:
    query : update的查询条件,类似sql update查询内where后面的。
    update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
    upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    writeConcern :可选,抛出异常的级别。

mongodb的安装(windows、linux)

  1. 选择适合与机器的bit版本,进行下载(需要耐心等待,速度有些慢)下载地址:http://www.mongodb.org/downloads
  2. 下载成功后进行安装尽量选择自定义安装目录
  3. 我将上图的路径放在了 D盘,会出现一个mongodb的目录MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下((如: C:\ 或者 D:\ 等 )。在D:根目录下创建一个data的目录然后在data目录里创建db目录(这里需要手动创建)。这时我们D盘下有两个文件mongodb和data
  4. 在cmd(命令行)下进入到D:\mongodb\bin\运行如下代码,来指定日志的输出路径

    运行结果大概

    这段命令执行完(需要保留此窗口,因为现在就已经建立了mongodb的连接),再另开一个cmd命令窗口,来进行设置和其他操作

  5. 将MongoDB服务器作为Windows服务运行:

    在D:\data\下创建一个dbConf\mongodb.log文件
    在新的命令窗口进入到D:\mongodb\bin\下执行如下代码,以下代码自行查看下表进行对号修改此命令

    下表为mongodb启动的参数说明:

    参数 描述
    –bind_ip 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
    –logpath 定MongoDB日志文件,注意是指定文件不是目录
    –logappend 使用追加的方式写日志
    –dbpath 指定数据库路径
    –port 指定服务端口号,默认端口27017
    –serviceName 指定服务名称
    –serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
    –install 指定作为一个Windows服务安装。
  6. 在D:\mongodb\bin下运行

    进入到mongodb后台管理shell

 

 

 

 

 

初步了解MongoDB

  • 使用原理:
    1. 所谓“面向集合”(Collenction-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无线数目的文档。集合的概念类似关系型数据库(RDBMS)里表(Table),不同的是他不需要任何定义模式(schema),Nytro MegaRAID技术中的闪存高速缓存算法,能够快速识别数据库内的大数据集中的热点数据,提供一致性的性能改进。
    2. 模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道他的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里
    3. 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)。
    4. MongoDB已经在多个站点部署,器主要场景如下:
      1. 网站实时数据处理。他非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性
      2. 缓存。由于性能很高,他适合作为信息基础设施的缓存层。在系统重启之后,有他搭建的持久层可以避免下层的数据源过载。
    5. 高伸缩性的场景。非常适合有数十或者数百台服务器组成的数据库,他的线路图已经包含对MapReduce引擎的内置支持。
    6.  不适用的场景:
      1. 传统商业智能应用
      2. 复杂的跨文档(表)级联查询。
  • 设计特征:
    1. 面向集合存储,容易存储对象类型数据。
    2. 模式自由,采用无模式结构存储。
    3. 支持完全索引,可以在任何属性上简历索引,包含内部对象。
    4. 支持查询,支持大部分sql中的查询
    5. 强大的聚合工具。如count、group,也支持MapReduce完成复杂的聚合任务
    6. 支持复制和数据恢复。
    7. 使用高效的二进制数据存储,包括大型对象(如视频)。
    8. 自动处理分片,以支持云计算层次的扩展。MongDB支持集群自动切分数据,对数据进行分片可以使集群存储更多的数据,实现更大的负载,也能保证存储的负载均衡。
    9. 支持Perl、PHP、Java、C#、Javascript、Ruby、C和C++语言驱动程序,MongDB提供了当前所有主流开发语言数据库驱动包,开发人员使用任何一种主流开发语言都可以轻松变成,实现访问MongoDB数据库。
    10. 文件存储格式为BSON(JSON的一种扩展)。BSON是二进制格式的JSON简称,它支持文档和数组的嵌套。
    11. 可以通过网络访问。可通过网络远程访问MongoDB数据库。
  • 基本概念
    1. 文档:是MongoDB中数据基础单位
    2. 集合:是一组文档,类似于关系数据库中的表
    3. 数据库:是多个文档组成,多个结合组成的数据库
      1. Admin数据库:权限数据库,如果创建用户时将该用户添加到admin数据库,那么该用户就自动承载了所有数据库的权限
      2. Local数据库:这个数据库永远不会被负责,可以存储本地单台服务器的任意集合。
      3. Config数据库:当MongoDB使用分片模式时,config数据库在内部使用,用于保存分片信息。
    4. 数据模型:

一个MongoDB实例可以包含一组数据库

一个DataBase可以包含一组Collection(集合)

一个集合可以包含一组Document(文档)

一个Document可以包含一组field(字段),每一个字段都是一个key/value pair。

Key:必须为字符串类型

Value:可以是基本类型(string、int、floating、timestamp、binary等)、一个Document、数组类型

  • 适用场景
    1. 网站数据:Mongo非常适合实时的插入、更新与查询,并具备网站实时数据存储所需要的复制及高度伸缩
    2. 缓存
    3. 大尺寸、低价值得数据:
    4. 高伸缩性的场所:
    5. 用于对象及json数据的存储

MySQL中如何获取下一条插入的自增ID 或 刚刚插入的id

MySQL中如何获取下一条插入的自增ID 或 刚刚插入的id

要立刻获得刚插入记录的id,该表必须有一个为一个AUTO_INCREMENT列生成的ID

$sql_addinfo ” insert into contact_info_group set contact_group_id=”,contact_id=” ” ;
mysql_query ( $sql_addinfo ) ;
echo mysql_insert_id () ;

mysql_insert_id – 取得上一步 INSERT 操作产生的 ID

int mysql_insert_id ( [resource link_identifier])
mysql_insert_id() 返回给定的 link_identifier 中上一步 INSERT 查询中产生的 AUTO_INCREMENT 的 ID 号。如果没有指定 link_identifier,则使用上一个打开的连接。

如果上一查询没有产生 AUTO_INCREMENT 的值,则 mysql_insert_id() 返回 0。如果需要保存该值以后使用,要确保在产生了值的查询之后立即调用 mysql_insert_id()。

注: MySQL 中的 SQL 函数 LAST_INSERT_ID() 总是保存着最新产生的 AUTO_INCREMENT 值,并且不会在查询语句之间被重置。
警告

mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id() 的返回值转换成 long(PHP 中命名为 int)。如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id() 返回的值将不正确。可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。

具体使用如下语句:mysql_query(”SELECT LAST_INSERT_ID()”);

PS: 在插入数据时候可以这样写insert into xxx (col_a, col_b) values (11,22);select LAST_INSERT_ID()这样不就可以取到最近生成的ID了吗.

常常需要在编程的时候获取当前表的下一个自增的ID值,因为表可能被删除之后造成最大的Max(ID) + 1并不是下一条ID的值,所以需要使用其他办法。通过查询Mysql的文档,会发现Mysql里面有一个函数叫做getLastInsertID,用来获取最后插入的表的ID值,但是对获取下一条插入的自增ID并没有太多帮助。

1. 方法1
插入一条测试记录,然后删除掉,获取ID。不再赘述。

2. 方法2
利用Mysql自带的一个函数语句 “SHOW TABLE STATUS” ,可以获取当前数据库里的所有表的属性等信息,通常用来做数据库的优化和维护。如果需要指定某一张表的话,可以通过两种方法指定。
一种是网上给出来的:
show table status like ‘TableName
另外就是常见的where语句
show table status where Name =’ TableName

得到的结果集里面有一列AUTO_INCREMENT,是一个Int值变量,获取之后就是下一个要插入的ID了。

//查看表“测试”的状态

$r = mysql_query(“show table status where name=’ceshi'”);
$r_h = mysql_fetch_assoc($r);
//获得下一条信息的id号
var_dump($r_h[‘Auto_increment’]);

windows下安装mysql5.7,没有配置向导问题

安装.msi文件到最后一步并没有像以前一样在finish界面的上方有个勾选的地方(是否进行配置向导),而是finish后就没有然后了,什么提示都没有!!!

解决方法如下:

  1. mysql的目录下也没有出现my.ini文件而是出现了一个,default.ini文件,这是默认的配置文件,这里将default.ini复制一份到改名为my.ini并将如下代码写入
    basedir=D:/wamp/mysql
    datadir=D:/wamp/mysql/data
    port=3306
  2. 建立data空文件夹
  3. 执行mysqld –initialize-insecure –user=mysql,官方文档说明,使用-initialize生成随机密码,使用-initialize-insecure是生成空密码。默认帐号root,后面的-user=mysql不更改
  4. 执行完mysqld –initialize-insecure –user=mysql命令后没有任何提示,直接执行net start mysql,成功开启

 

解决windows下的mysql匿名登陆无法使用mysql数据库的问题

转自:http://www.it165.net/database/html/201402/5328.html

我在windows下安装了mysql,但是不用密码就能登进去,而root明明是有密码的,我用select user()命令查看当前登录用户是root。

查看数据库,只能看到自带的两个数据库(information_schema和test),mysql这个数据库都看不到。如果运行use mysql,就会出现 Access denied for user ”@’localhost’ to database ‘mysql’, 这说明这是匿名登录的,几乎什么权限都没有。即使用mysql -u root登录也是提示这个。

网上搜了很多资料,大多数是教的怎么在linux下解决这个问题。

我综合了大多数的方法,自以为找到了解决的办法:

1.首先,网上的资料都提到了需要关闭mysqld这个服务来屏蔽权限检查,我查看了任务管理器,发现的确有一个叫mysqld.exe的程序在运行:

直接关闭这个进程

我查阅了帮助手册,”MySQL服务器也就是mysqld,是在MySQL安装中负责大部分工作的主程序。服务器随附了几个相关脚本,当你安装MySQL时它们可以执行设置操作,或者是帮助你启动和停止服务器的帮助程序。“ 我估计它相当于mysql的守护进程,不停止它就无法设置启动脚本。

2.网上都提到了

mysqld-nt –skip-grant-tables

mysqld_safe –skip-grant-tables

safe_mysqld –skip-grant-tables 等关闭权限检查的方法,但是我在CMD命令提示符下输入都提示:“mysqld_safe”不是内部或外部命令,也不是可运行的程序或批处理文件。

于是我查看mysql安装目录下的bin文件夹里有哪些相关的文件:

(1)mysqld.exe (2)mysqld_multi.pl

我查看了帮助手册,“在Unix和NetWare中推荐使用mysqld_safe来启动mysqld服务器。mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息。为了保持同旧版本MySQL的向后兼容性,MySQL二进制分发版仍然包括safe_mysqld作为mysqld_safe的符号链接。默认情况下,mysqld_safe尝试启动可执行mysqld-max(如果存在),否则启动mysqld。”

我估计mysqld_safe是mysqld.exe文件里的一个启动选项。所以我尝试了这样输入:

先跳转到mysql的bin目录下,再输入mysqld –skip-grant-tables。这时候有可能一直没有反应的样子,不会生成新的一行输入。

实际上它已经停止了权限检查,我们可以进行其他操作了。

3.重新打开一个cmd命令提示符窗口,进入到mysql里面,然后输入use mysql,就会发现成功了!:

看到没?上面最后一行提示的是Database changed!!

如果你输入show tables就会看到这个数据库下有个表叫user,记录了登陆的账户名和密码。

所以你可以这样修改root账户的密码:

UPDATE user SET Password=PASSWORD(‘123′) WHERE user=’root’;

这时你使用MySql Command Line Client登陆的话,就会要求输入密码123了!你已经不是匿名登陆,所以可以进行各种操作了!!!

远程连接mysql错误1130

错误提示:1130,ERROR 1130: Host xxx.xxx.xxx.xxx  is not allowed to connect to this MySQL server

解决办法:

登录线上数据库:mysql -u ***  -h localhost -p

找到mysql数据库的user表:

 

 

 

将”localhost”修改问”%”

还没完,还需要重新刷新下MySQL的系统权相关表

mysql 新设置用户或更改密码后需用flush privileges刷新MySQL的系统权限相关表,否则会出现拒绝访问

(还有一种方法,就是重新启动mysql服务器,来使新设置生效。­)