MySQL全文搜索-布尔全文搜索

一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,
但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。

从5.6以后的版本。innodb也支持full text,之前只有myiasm支持full text, 当操作是大量读的时候,可使用myiasm,性能比innodb优越,但涉及事务的话,还是要选择innodb的。

继续阅读MySQL全文搜索-布尔全文搜索

centos7安装mysql

0、官网下载一个mysql大集合:mysql-5.7.9-1.el6.x86_64.rpm-bundle.tar
1、tar xvf mysql-5.7.9-1.el6.x86_64.rpm-bundle.tar
2、rpm -qa | grep mariad
3、rpm -e –nodeps mariadb-libs-5.5.37-1.el7_0.x86_64
4、rpm -ivh mysql-community-common-5.7.9-1.el6.x86_64.rpm
5、rpm -ivh mysql-community-libs-5.7.9-1.el6.x86_64.rpm
6、rpm -ivh mysql-community-client-5.7.9-1.el6.x86_64.rpm
7、rpm -ivh mysql-community-server-5.7.9-1.el6.x86_64.rpm
8、service mysqld start

迁移mysql/远程连接mysql

镜像部署的 mysql 的安装目录及数据目录都存放在系统盘中,同样考虑到系统盘空间 不够用的情况,后面如果我们部署的 mysql 数据量很大,这里就需要我们将我们的 mysql 迁移至数据盘中。mysql 迁移至数据盘中,一般指将 mysql 的数据目录迁移至数 据盘中。具体操作步骤可以参考如下:

1、首先格式化磁盘,并将数据盘挂载在 mnt 目录下(根据自己的需求,也可以挂载在其他目录下)

mkdir -p /mnt/data
2、用 mysqldump 命令导出您项目所有的数据,命令参考如下:

mysqldump -p –all-databases > all.sql 3、停止 mysql :

     /etc/init.d/mysqd stop

4、vim /etc/init.d/mysqd 将文件中“datadir=/xxx/server/mysql/data”中的 目录地址更改为您迁移至数据盘中的目录地址,即“datadir=/mnt/data”。

5、然后用以下命令初始化一个全新的数据库环境:

/xxx/server/mysql/scripts/mysql_install_db — basedir=/xxx/server/mysql –datadir=/mnt/data –user=mysql

值得注意的是 datadir 为 mysql 的数据目录。

6、启动 mysql,然后将数据还原至新的数据盘中:

     /etc/init.d/mysqld start
     mysql <  all.sql
    /etc/init.d/mysqld restart

 

设置远程连接myql:

1、连接进入 mysql。

2、执行以下 mysql 命令:

use mysql #打开 mysql 数据库
#将 host 设置为%表示任何 ip 都能连接 mysql,当然您也可以将 host 指定为某个 ip

update user set host=’%’ where user=’root’; flush privileges; #刷新权限表,使配置生效 然后我们就能远程连接我们的 mysql 了。

3、关闭远程连接,恢复 mysql 的默认设置(只能本地连接),可以通过以下步骤操作:

use mysql #打开 mysql 数据库
#将 host 设置为 localhost 表示只能本地连接 mysql update user set host=’localhost’ where user=’root’; flush privileges; #刷新权限表,使配置生效

备注:也可以添加一个用户名为 yuancheng,密码为 123456,权限为%(表示任意 ip 都能连接)的远程连接用户。命令参考如下:

grant all on *.* to ‘yuancheng’@’%’ identified by ‘123456’;

flush privileges;

linux下安装mysql以及The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid)解决方法

Starting MySQL. ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).解决方法:

cd /usr

cat my.conf 是否看见你的port没有设置,我看这个话一直没有找到原因..后来去cat了一下my.cnf(在/usr下),猜测可能是没有指定portnumber的原因,故设置port=3306,并取消掉注释,ok,fine。。

然后我用的是centos 6.6(final)。

从mysql官网下载了rpm包后,通过 rpm -qa | grep -i mysql 发现我还有一个mysql-libs-xxx包,安装server和client之前,先卸载掉一切与mysql有关的包,因为有一堆依赖,用rpm -ev这样并不方便操作,所以,我们用:

sudo yum -y remove mysql-libs-5.1.73-3.el6_5.x86_64

会卸掉所有依赖项,ok,然后再用

rpm -ivh mysql-server…..

rpm -ivh mysql-client…..

有可能遇到我上面遇到的那个问题,我反正百度没有解决到,但是通过修改my.cnf,指定了port,搞定了。(因为我觉得pid是指进程端口号(port id))

service mysql start, ok

再次,mysql -uroot (当然,密码有问题的,可以自行百度搜索方法重置。这里提供一个:

# service mysql stop

# mysqld_safe –user=mysql –skip-grant-tables –skip-networking

然后关掉终端,重新进入

# mysql -uroot

 

mysql> use mysql;

mysql> UPDATE user SET Password=PASSWORD(‘yourpassword’) where User=’root’;

ok,进入

这个方法修改密码后, 重启mysql之后,可能遇到即使输入了密码进入后报下面这个错误

ERROR 1820 (HY000): You must SET PASSWORD before executing this statement。

只用输入SET PASSWORD=PASSWORD(‘yourpassword’)就好了。

Group by 与 having / where

在使用聚合函数时,我们时常会用到group by, 在select后面跟的所有非聚合函数,都需要写到group by 后面,如:

select max(cost), id, sex from test group by id, sex;

而having和where的区别在,where是在group by 之前,我们就对原来的数据做了一次筛选。而having是在group by之后,我们再做筛选,如:

select max(cost), id , sex from test group by id, sex where sex = ‘female’;

我们选择的就是所有女性记录消费最大的额度及对应id,是先有where后有group by

而having是:

select max(cost), id, sex from test group by id,sex having max(cost) > 10000;

选择了最大消费大于10000的那些记录,是先有group by后有 having

sql中的执行顺序为:

8)SELECT (9)DISTINCT  (11)<Top Num> <select list>
(1)FROM [left_table]
(3)<join_type> JOIN <right_table>
(2)ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH <CUBE | RollUP>
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

python – MySQLdb 基本操作

import MySQLdb
//连接
conn = MySQLdb.connect(host=’localhost’, user=’root’, passwd=”, port=3306)
//获取游标
cur = conn.cursor()
//执行sql语句
cur.execute(sql)
//执行多条sql语句
cur.executemany(sql, values)
//插入数据时光有execute是不行滴,一定要commit(),否则无效

cur.execute(sql)
for row in cur.fetchall():
    print row[0], row[1]

//一个简单的查询后的使用方法

conn.commit()
//关闭游标
cur.close()
//关闭数据库连接
conn.close()

修改一次性插入mysql的数据大小及向mysql导入文件数据

一、修改插入数据的packet大小
用python读取时,发现一次性插入的数据过多(executemany(“…..”)),导致抛出异常,显示的像是连接超时,几经摸索后,发现是设置的数据大小不足,解决方法:
在终端进入mysql或者通过其他管理器进入:
输入,
show VARIABLES like ‘%max_allowed_packet%’;
显示的结果为:
| Variable_name | Value |
| max_allowed_packet | 1048576 |
这个其实只有1m的大小,试想你有数G内容,分成几千次插入肯定不现实,很慢。
所以我们直接把这个参数改了 :
set global max_allowed_packet = 2*1024*1024*10 这样就是20m,当然具体还是要看你的需求了。
(真的非常大大实话还要考虑下你的timeout,可以看下show VARIABLES like ‘%time_out%’,配合修改大小哦,以免等待超时了,还是会失去连接)

二、导入csv数据
LOAD DATA INFILE ‘yourfile.txt’
INTO TABLE user_use_info
//设置你的字段分割,我这里是csv,所以是制表符分割
FIELDS TERMINATED BY ‘\t’
//你的字段内容有没有被什么符号包裹起来, 比如”朱清” , 如果你只想要里面的中文,不要引号, 就请在这里定义
OPTIONALLY ENCLOSED BY ‘””‘
//设置记录之间用什么分割,我这里是换行,所以是换行符分割
LINES TERMINATED BY ‘\n’
此外还要注意,需要将你的文本移至/tmp下面去,之所以要用/tmp目录的原因是mysql默认使用了/tmp作为临时读写目录。

select into from 提示 Undeclared variable…..错误的解决办法

在进行数据库表的复制与备份的操作过程中,我们应该都知道有 select into from 和 insert into select 两种方法吧?关于这两种方法的区别和用法,这里就不多说了,有需要的朋友可以参照此篇文章:

select into from 和 insert into select 的区别和用法

然而今天在使用 SELECT INTO FROM 备份mysql数据表的时候,运行相关 sql 语句的时候却一直返回 [Err] 1327 – Undeclared variable: …… 这种错误,实在不解,经过查询相关资料才知道,原来 mysql 数据库是不支持 SELECT INTO FROM 这种语句的,但是经过研究是可以通过另外一种变通的方法解决这个问题的,下面就来说说解决这个错误的办法吧!

进过搜索相关资料以及实验结果证实,可以使用

Create table Table2 (Select * from Table1);

这种语句代替

SELECT vale1, value2, value3 into Table2 from Table1;

下面看一个本人实际操作中的例子吧!

create table o_hascate (select o.id_o, o.price, o.createdtime, p.id_p from Orders o inner join Persons p on p.id_p = o.id_p);

mark一个, hibernate向mysql插入数据时中文乱码问题

实战岀经验.. 跟小学弟一起成长,虽然不是我做的,也学到了。

将hibernate中connection.url的内容改为:

<property name=”connection.url”><![CDATA[jdbc:mysql://localhost:3306/yzsp?useUnicode=true&characterEncoding=utf8]]></property>

 

ps :以前php写后台的时候也遇到过这个问题,当时的解决方法是连接数据库后 加上 mysql_set_charset(‘utf8’);