标签归档:MySQL

Mysql中union和order by的问题及优先级

在Mysql的参考手册中,并没有对union和order by的优先级进行说明 它建议的方法是,对SQL语句加上(),这样能使SQL的语义更清晰 例如,需要对union后的结果进行order by,则: (SELECT a FROM tbl_name WHERE a=10 AND B=1) UNION (SELECT a FROM tbl_name WHERE a=11 AND B=2) ORDER BY a LIMIT 10; 如果,需要对单个SQL语句进行order by,则应把order by子句放入圆括号中,如下: (SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY … 继续阅读

发表在 Database, Excellence Article | 标签为 | 一条评论

MySQL写入优化

innodb_buffer_pool_size 如果用Innodb,那么这是一个重要变量。相对于MyISAM来说,Innodb对于buffer size更敏感。MySIAM可能对于大数据量使用默认的key_buffer_size也还好,但Innodb在大数据量时用默认值就感觉在爬了。 Innodb的缓冲池会缓存数据和索引,所以不需要给系统的缓存留空间,如果只用Innodb,可以把这个值设为内存的70%-80%。和 key_buffer相同,如果数据量比较小也不怎么增加,那么不要把这个值设太高也可以提高内存的使用率。 innodb_additional_pool_size 这个的效果不是很明显,至少是当操作系统能合理分配内存时。但你可能仍需要设成20M或更多一点以看Innodb会分配多少内存做其他用途。 innodb_log_file_size 对于写很多尤其是大数据量时非常重要。要注意,大的文件提供更高的性能,但数据库恢复时会用更多的时间。我一般用64M-512M,具体取决于服务器的空间。 innodb_log_buffer_size 默认值对于多数中等写操作和事务短的运用都是可以的。如果经常做更新或者使用了很多blob数据,应该增大这个值。但太大了也是浪费内存,因为1秒钟总会 flush(这个词的中文怎么说呢?)一次,所以不需要设到超过1秒的需求。8M-16M一般应该够了。小的运用可以设更小一点。 innodb_flush_log_at_trx_commit (这个很管用) 抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。 上面是网上看的,我发现慢查询日志内有很多update和insert的查询,就把innodb_flush_log_at_trx_commit改成了2,效果很明显,改成0会更明显,但安全性比较差。做下面的操作启动mysqld就生效: vim /etc/my.cnf innodb_flush_log_at_trx_commit=2 也可以在mysqld运行时执行: set GLOBAL innodb_flush_log_at_trx_commit = 2 下面是mysql手册上innodb_flush_log_at_trx_commit的解释: 如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行;但是,这种模式下,在事务提交的时候,不会有任何动作。如果 innodb_flush_log_at_trx_commit设置为1(默认值),log buffer每次事务提交都会写入log file,并且,flush刷到磁盘中去。如果innodb_flush_log_at_trx_commit设置为2,log … 继续阅读

发表在 Excellence Article | 标签为 | 留下评论

mysql分页limit 优化

mysql的分页比较简单,只需要limit offset,length就可以获取数据了,但是当offset和length比较大的时候,mysql明显性能下降 1.子查询优化法 先找出第一条数据,然后大于等于这条数据的id就是要获取的数据 缺点:数据必须是连续的,可以说不能有where条件,where条件会筛选数据,导致数据失去连续性 实验下 Sql代码  mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) mysql> select count(*) from Member; +———-+ | count(*) | +———-+ |   169566 | +———-+ 1 row in set (0.00 sec) mysql> pager grep !~- PAGER set to ’grep !~-’ mysql> select * from Member limit 10, 100; 100 rows in set (0.00 sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100; 100 rows in set (0.00 sec) mysql> select * from Member limit 1000, 100; 100 rows in set (0.01 sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100; 100 rows in set (0.00 sec) mysql> select * from Member limit 100000, 100; 100 rows in set (0.10 sec) mysql> select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100; 100 rows in set (0.02 sec) mysql> nopager PAGER set to stdout mysql> show profiles\G *************************** 1. row *************************** Query_ID: 1 Duration: 0.00003300 Query: select count(*) from Member *************************** 2. row *************************** Query_ID: 2 Duration: 0.00167000 … 继续阅读

发表在 Excellence Article | 标签为 | 留下评论

Hive使用笔记

Hive是为提供简单的数据操作而设计的下一代分布式数据仓库。它提供了简单的类似SQL的语法的HiveQL语言进行数据查询。同时,HiveQL语言能力不足时,它也能允许使用传统的map/reduce进行复杂数据分析。 Hive是搭建在Hadoop平台之上的。Hive并不是一个真正的数据库,它的元数据需要存储在其他数据库中(例如mysql)。。Hadoop平台提供了HDFS分布式存储系统和map/reduce分布式计算系统,而Hive在这两个系统之上,使得用户只需使用熟悉SQL语言就能进行分布式计算,而map/reduce编程往往是相当复杂的。Hive在少量数据运算或是短时间内的重复查询上,是不能和Oracle那样的数据库相比的。它的查询量通常相当大,一个大的job运行几个小时算是正常的。 数据类型 。HiveQL只支持以下几种基本数据类型TINYINT, SMALLINT, INT, BIGINT, DOUBLE, STRING。 支持的复杂数据类型有Structs, Maps, Arrays。 创建表。 Hive不同于其他数据库,它只有一个默认数据库”default” ,所有的table都保持在里面。 CREATE TABLE user(id BIGINT, name STRING); 可以指定将表创建到外部hdfs文件系统中。 CREATE EXTERNAL TABLE foo(id INT) STORED AS TEXTFILE LOCALTION ‘/user/foo/foo_data’; 将数据文件导入到Hive表中。 LOAD DATA [LOCAL] INPATH ‘/data/userdata’ [OVERWRITE] INTO … 继续阅读

发表在 Excellence Article, Study & Reading | 标签为 | 留下评论

MySQL通信协议

MySQL实现了四种通信协议 TCP/IP协议,通常我们通过来连接MySQL,各种主要编程语言都是根据这个协议实现了连接模块 Unix Socket协议,这个通常我们登入MySQL服务器中使用这个协议,因为要使用这个协议连接MySQL需要一个物理文件,文件的存放位置在配置文件中有定义,值得一提的是,这是所有协议中最高效的一个。 Share Memory协议,这个协议一般人不知道,肯定也没用过,因为这个只有windows可以使用,使用这个协议需要在配置文件中在启动的时候使用–shared-memory参数,注意的是,使用此协议,一个host上只能有一个server,所以这个东西一般没啥用的,除非你怀疑其他协议不能正常工作,实际上微软的SQL Sever也支持这个协议 Named Pipes协议,这个协议也是只有windows才可以用,同shared memory一样,使用此协议,一个host上依然只能有一个server,即使是使用不同的端口也不行,Named Pipes 是为局域网而开发的协议。内存的一部分被某个进程用来向另一个进程传递信息,因此一个进程的输出就是另一个进程的输入。第二个进程可以是本地的(与第一个进程位于同一台计算机上),也可以是远程的(位于联网的计算机上)。正因为如此,假如你的环境中没有或者禁用TCP/IP环境,而且是windows服务器,那么好歹你的数据库还能工作。使用这个协议需要在启动的时候添加–enable-named-pipe选项 Named Pipes和Shared Memory协议都非常的低效,而且只能用于windows环境,非必要情况尽量避免使用

发表在 Database | 标签为 | 一条评论

MySQL 5.1.56 使用 InnoDB Plugin

[root@localhost mysql-5.1.56]# ./configure –prefix=/usr/local/mysql/ \ –without-debug \ –with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \ –with-client-ldflags=-all-static \ –with-mysqld-ldflags=-all-static \ –enable-assembler \ –with-charset=utf8 \ –with-collation=utf8_general_ci \ –with-extra-charsets=latin1,gb2312 \ –with-pthread –enable-thread-safe-client \ –with-plugins=myisam,innodb_plugin

发表在 Database | 标签为 | 留下评论

MySQL 先排序再分组的问题

group是分组,想先排序如何办? 建一个表试试 – – 表的结构 `test` – CREATE TABLE IF NOT EXISTS `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(16) NOT NULL, `phone` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; – – 导出表中的数据 `test` – INSERT … 继续阅读

发表在 Excellence Article | 标签为 , | 留下评论

PHP中操作mysql执行存储过程

存储过程和函数是MySql5.0中引入的。关于这方面的操作在PHP里面没有直接的支持。但是由于Mysql PHP API的设计,使得我们可以在以前的PHP版本中的mysql php api中支持存储过程和函数的调用。 在php中调用存储过程和函数。 1.调用存储过程的方法。 a. 如果存储过程有 IN/INOUT参数,声明一个变量,输入参数给存储过程,该变量是一对, 一个php变量(也可以不必,只是没有php变量时,没有办法进行动态输入),一个Mysql变量。 b.如果存储过程有OUT变量,声明一个Mysql变量。mysql变量的声明比较特殊,必须让mysql服务器知道此变量的存在,其实也就是执行一条mysql语句。 如 set @mysqlvar=$phpvar ; c.使用mysql_query()/mysql_db_query()执行mysql 变量声明语句。 mysql_query(“set @mysqlvar [=$pbpvar]“); 这样,在mysql服务器里面就有一个变量,@mysqlar。如果时IN参数,那么其值可以有phpar传入。 d. 如果是存储过程。 1. 执行 call procedure()语句。 也就是mysql_query(“call proceduer([var1]…)”); 2. 如果有返回值,执行select @ar,返回执行结果。 mysql_query(“select @var)” 接下来的操作就和php执行一般的mysql语句一样了。可以通过mydql_fetch_row()等函数获得结果。 如果时函数。 直接执行 select function() … 继续阅读

发表在 Database | 标签为 | 3 条评论

Mysql存储过程学习笔记–变量、参数、注释

变量定义: DECLARE variable_name [,variable_name...] datatype [DEFAULT value]; 其中,datatype为mysql的数据类型,如:INT, FLOAT, DATE, VARCHAR(length) 例: DECLARE l_int INT unsigned default 4000000; DECLARE l_numeric NUMERIC(8,2) DEFAULT 9.95; DECLARE l_date DATE DEFAULT ’1999-12-31′; DECLARE l_datetime DATETIME DEFAULT ’1999-12-31 23:59:59′; DECLARE l_varchar VARCHAR(255) DEFAULT ‘This will … 继续阅读

发表在 Database | 标签为 | 留下评论

数据库的层次结构

1、树状结构 在历史上,层次数据库最早出现,将数据库保存为文件中的记录,各种逻辑被嵌套到一起,而没有将同样的记录按照线性排列。层次数据库对某些查询非常适合,但是过强的结构限制了人们对数据的自由操控,后来出现的网络(CODASYL)数据库,虽然灵活了很多,但数据操控仍然很困难,知道关系型理论的出现,才证明的了数据库设计是科学而不是工艺,然而,因为层次模型很有弹性,所以层次结构依然极为常见(至少层次描述非常常见),例如XML和LDAP等层次技术非常活跃,严格的说HTML也算是一种层次存取数据的方式。 层次式数据不太容易理解,比如ERP系统中最基本的物料单,层次结构之所以复杂,主要原因不是因为组件之间的关系表达,而是访问树的方式,我们访问树的部分或全部节点,通常按照顺序返回这些节点,访问树通常由DBMS引擎以过程性方式实现,而过程性操作正是违背关系理论的主要表现之一。 2、树状结构和主从结构 很多人认为“父子关系”和“主从关系”没有什么不同,实际上这两种关系有着很多的不同。 1) 树状结构保存只需要一个表。代表层次结构的树,其所有节点完全相同,叶子节点的类型有时可能不同,例如文件系统中的文件夹和文件节点,如果撇去这点,所有的节点类型完全相同,我们可以用相同的方法描述,而且同一个表来代表节点,换句话说,表与它本身之间有种主从关系,而不是两个类型不同的表关系。 2)深度。层次结构中,与根节点的距离本身是重要的信息,而在主从关系中,不是主表就是明细表。 3)所有权。主从关系中,可以明确的外键完整性约束,例如,每个表中订单必须与另外一张表的已存在的ID对应,但层次结构,比如,虽然比如经理的工号虽然是参照已经存在的员工的工号规则来的,但是经理向老板报告,不跟员工报告,这会导致NULL值问题。 4)多重父节点。以父节点似乎别数据结合子节点,是假设一个子节点只有一个父节点,实际上生活中,很多情况下都不是这样,比如机械零件和螺丝钉,那就不是树了,父子关系就无能为力了。 其实某位大牛曾经说过:从关系理论角度去理解树的结构,树有两种实体类型,一个是节点,另一个是节点之间的连接。这样的设计世界上是解决了完整性约束的的问题,因为只有实际存在连结的节点才能被描述。这种描述实际上最后能描出一个图来,也就是能解决一个子节点对应多个父节点的问题。 DBMS厂商常常实现了空间数据处理或全文索引等特殊功能,但对层次结构的支持很薄弱或者根本没有。 处理层次结构的主要困难在于树的访问,当然仅仅为了在图形用户界面中显示树状结构,每次用户点击将树展开并没有什么问题

发表在 Database | 标签为 , | 留下评论