随笔分类 -  数据库

记录与数据库相关
摘要:网站如果有很多用户上传图片(相册,商品图片),一般的做法是将用户图片保存在磁盘上面(数据库中记录图片的地址)。用户上传的时候按照原图、中图、小图等各个尺寸都生成一份保存在磁盘上。比如php的网店系统echsop就是这么做的,而shopex之类也大同小异。这种做法也不是不可以。多生成几个尺寸,在磁盘上... 阅读全文
posted @ 2013-12-18 21:39 王滔 阅读(6372) 评论(2) 推荐(0) 编辑
摘要:本篇文章讨论并不是:不要使用存储过程,因为有些事情还是要存储过程来完成,不可能不用。而是关于:"业务逻辑是不是要封装在存储过程中实现,这样子php、java等就是调用存储过程"。业务逻辑,通俗说就是:比如要取数据的操作,取出会员编号为x的数据,原来我们一般是封装成函数,或者直接编写sql语句查询。现... 阅读全文
posted @ 2013-12-15 13:06 王滔 阅读(7960) 评论(4) 推荐(4) 编辑
摘要:存储引擎 支持的锁定级别 myisam 表级别 memory 表级别 inndb 行级别 bdb: 页级别 lock锁定类型 锁定方式 目的 读锁 自己与其他线程只能读取该表 写锁 只有当前线程能够对表进行写入操作(其他线程也无法读这部分数据) 读锁的英文叫法是shared locks,shared 阅读全文
posted @ 2013-12-07 23:49 王滔 阅读(11932) 评论(0) 推荐(3) 编辑
摘要:商品图片,用户上传的头像,其他方面的图片。目前业界存储图片有两种做法: 1、 把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数据。比如mysql中有个blob字段。oracle数据库中是blob或bfile类型 2、 图片存储在磁盘上,数据库字段中保存的是图片的路径。 阅读全文
posted @ 2013-11-24 22:00 王滔 阅读(99108) 评论(13) 推荐(31) 编辑
摘要:这篇文章来自于看博客园一个园友的分享经历,原文:http://www.cnblogs.com/qqloving/p/3427138.html他不清楚mysql一个库里面分多少张表合适,他一个库分了8000张表。于是我看了,忍不住作答。于是以个人随笔的形式给自己做知识备忘吧。1、单表体积多大的时候需要分表曾经看过一个博客,分析到什么情况下需要分表。单表形式访问(也就是对这个表的访问不涉及到join联合查询):单个表的体积大于2g的时候。或者说,单个表的行数达到一千万的时候。两表jion:表的体积大于2G或行数大于500W。在赶集网石展提到的分享中,纯int行不能超过1000万行,含char类型的 阅读全文
posted @ 2013-11-17 20:39 王滔 阅读(11560) 评论(0) 推荐(0) 编辑
摘要:查看当前服务器是否开启慢查询:1、快速办法,运行sql语句show VARIABLES like "%slow%" 2、直接去my.conf中查看。my.conf中的配置(放在[mysqld]下的下方加入)[mysqld]log-slow-queries = /usr/local/mysql/var... 阅读全文
posted @ 2013-09-06 00:06 王滔 阅读(16871) 评论(0) 推荐(0) 编辑
摘要:目前流行几种备份方式:1、逻辑备份:使用mysql自带的mysqldump工具进行备份。备份成sql文件形式。优点:最大好处是能够与正在运行的mysql自动协同工作,在运行期间可以确保备份是当时的点,它会自动将对应操作的表锁定,不允许其他用户修改(只能访问)。可能会阻止修改操作。sql文件通用方便移植。缺点:备份的速度比较慢。如果是数据量很多的时候。就很耗时间。如果数据库服务器处在提供给用户服务状态,在这段长时间操作过程中,意味着要锁定表(一般是读锁定,只能读不能写入数据)。那么服务就会影响的。备注:所谓的与mysql服务器能够自动协同工作,实际上是指加参数来控制mysql服务器,比如锁定所有 阅读全文
posted @ 2013-09-05 23:50 王滔 阅读(18557) 评论(2) 推荐(3) 编辑
摘要:mysql的用户密码保存在数据库中是加密的。不可逆的。当需要创建一个新的帐号,如果是使用insert插入一条记录,mysql提供了一个函数PASSWORD(),对明文进行加密。所以有如下sql:insert into mysql.user values('帐号名',PASSWORD('设置的帐号密码... 阅读全文
posted @ 2012-04-04 18:59 王滔 阅读(3531) 评论(0) 推荐(0) 编辑
摘要:如果你的需要是统计总行数时,为什么要使用count(*),而避免使用指定具体的列名?count()函数里面的参数是列名的的时候,那么会计算这个字段有值项的次数。也就是,该字段没有值的项并不会进入计算范围(就是网上常说的值为null的项不纳入统计)很多地方都有类似表述:COUNT ( column )... 阅读全文
posted @ 2011-04-12 22:54 王滔 阅读(33314) 评论(1) 推荐(2) 编辑
摘要:一、通信知识中的半双工概念通信的方式分为:单工通信,半双工,全双工。全双工的典型例子是:打电话。电话在接到声音的同时也会传递声音。在一个时刻,线路上允许两个方向上的数据传输。网卡也是双工模式。在接收数据(比如一直在下载东西)的同时,又发送数据(比如请求网页)半双工:在同一个时刻只能进行一个动作。在一个时刻,线路上只允许一个方向上的数据传输。单工:典型例子就是电视遥控器。接收端和发送端已经固定了的。接收端只能接收数据。没有发送数据的功能。发送端只有发送的功能。没有接收的功能.特点是,线路上的数据流是永远是单方向,固定方向。这样理解的话,显示器与电脑主机之间的工作方式也是单工模式的。问:是半双工还 阅读全文
posted @ 2011-04-12 22:36 王滔 阅读(2886) 评论(0) 推荐(0) 编辑
摘要:下面是记录使用二进制的方式安装mysql的步骤 2011.3.5 使用二进制安装的好处mysql安装为什么大部分使用二进制安装。而不是源码手动去编译?mysql使用的glibc进行开发的。glibc库是一个底层api,所以只要是linux,都会有glibc库。所以,mysql安装不需要考虑环境是否符合要求。移植性很方便。直接将编译好的二进制代码复制到另外一个机器上,也是可以用的。原理性东西:一般在linux下安装一个软件,不同软件所需要的函数库不同。于是会遇到一个现象:一个软件复制到另外一个平台可能无法运行。安装软件需要先侦测环境就是出于此考虑。因为mysql使用的是通用的glibc函数库。没 阅读全文
posted @ 2011-03-07 17:28 王滔 阅读(7127) 评论(0) 推荐(0) 编辑
摘要:总结的方向:在linux下php挂接mysql.so扩展的方法问题背景:平常我们都是先安装mysql,然后才能去安装php。假如先安装php,后安装mysql,由于php需要连接mysql,因而在php引擎中需要配置使用mysql.so扩展。这时需要手动编译生成mysql.so扩展。当前问题:在上面情况下,使用phpize能否实现挂接mysql.so扩展?实践结论:使用phpize工具能够生成mysql.so,但是必须加上"--with-mysql=mysql客户端的路径"。也就是mysql.so模块必须用到mysql客户端才行。可以这样理解,mysql.so内部会调用my 阅读全文
posted @ 2011-03-07 12:30 王滔 阅读(29167) 评论(0) 推荐(0) 编辑
摘要:一、使用视图的理由是什么?1.安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。2.查询性能提高。3.有灵活性的功能需求后,需要改动表的结构而导致工作量比较大。那么可以使用虚拟表的形式达到少修改的效果。这是在实际开发中比较有用的例子:假如因为某种需要,a表与b表需要进行合并起来组成一个新的表c。最后a表与b表都不会存在了。而由于原来程序中编写sql分别是基于a表与b表查询的,这就意味着需要重新编写大量的sql(改成向c表去操作数据)。而通过视图就可以做到不修改。定义两个视图名字还是原来 阅读全文
posted @ 2011-02-24 23:11 王滔 阅读(108005) 评论(9) 推荐(6) 编辑
摘要:常常使用的到了更新操作。学习后,知道了update还有其他一些用法,以前并不知道。现在进行总结一、update后面使用order by的情况什么时候有必要增加order by:假如一个表中有自增型或者唯一键id。当想实现对所有id都加一。就会用到类似如下的sql: update teams set teamno=teamno+1 此时就会出现问题,假如有两行数据,一行的teamno=6,另一行的teamno=7。当执行teamno=teamno+1语句,6的值加上1变成7,但是还存在teamno=7的一行,那么就会出现重复而报错。解决办法是,先让teamno=7的行执行更新,然后才让teamn 阅读全文
posted @ 2011-02-23 12:37 王滔 阅读(2890) 评论(0) 推荐(0) 编辑
摘要:set语句的学习:使用select定义用户变量的实践将如下语句改成select的形式:set @VAR=(select sum(amount) from penalties);我的修改:select @VAR:=(select sum(amount) from penalties);我这样改,虽然是可以的。但是,对比的书中的答案,发现这样的方式太蹩脚了。说明没有很好地理解select定义变量的本质。在select中,发现有一个用户变量,如果没有定义,那么就会初始化。select子句原来的方式根本不受到影响。只是增加了用户变量。所以,还是按照原来的方式使用select子句。那么像:select 阅读全文
posted @ 2011-02-21 14:43 王滔 阅读(110991) 评论(4) 推荐(3) 编辑