mysql

更新日期: 2016-05-22 阅读次数: 7343 分类: MySQL

Quick Links

高效的 MySQL GUI 工具

  • Ubuntu 上的 MySQL Workbench

GRANT PRIVILEGE

$ mysql -u root -p
> GRANT SELECT ON db_test.table_test TO 'user_test'@'%' IDENTIFIED BY 'password';

or

> CREATE DATABASE db_test;
> GRANT ALL PRIVILEGES ON db_test.* TO 'user_test'@'localhost' IDENTIFIED BY 'password';

对于 foreign key 是否需要手动建索引

MySQL 的 innodb 会帮你自动创建的。

参考

  • http://stackoverflow.com/questions/304317/does-mysql-index-foreign-key-columns-automatically

ubuntu 关闭 mysql 服务

  • 关闭 sudo service mysql stop
  • 启动 sudo service mysql start

当列数较多时,将 mysql console 里的查询结果竖着排列展示

mysql> select * from quotes order by id desc limit 1 \G
*************************** 1. row ***************************
         id: 1001 
   quote_id: 76b84568-fa95-11e1-90d3-0819a6248970
        tag: running
     author: zhongwei

查看已创建的用户及权限

> SELECT User FROM mysql.user;
> SHOW GRANTS FOR 'account'@'localhost';

注意,如果只指定用户名的话,默认是 '%' 而不是 localhost。

所以当运维或者 DBA 给我们开通了权限后,我们第一件事情就是确认权限是否完全开通. 通常生产环境的 mysql 是限制用户的访问 IP 的,所以需要将 localhost 替换为自己的 IP。

参考:

使用 MySQL 存储 schema-less 数据的探索

table design:

表结构做成 id, key, value 还是 key, value 比较好。

按照 Bret Taylor 的分享,比较好的设计是

  • added_id -> INT NOT NULL AUTO_INCREMENT PRIMARY KEY
  • id -> UNIQUE KEY
  • updated -> KEY
  • body -> json

之所以加上自增的 added_id, 是因为 Mysql InnoDB 是按照主键顺序在磁盘上顺序存储 数据的。这样就能保证新数据总是能写在旧数据的后面,因为新数据读取的频率总会高于 旧数据,磁头不会波动太大。

e.g.

CREATE TABLE entities (
    added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    id CHAR(32) NOT NULL,
    updated DATETIME NOT NULL,
    body MEDIUMBLOB,
    UNIQUE KEY (id),
    KEY (updated)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

notes:

  • id -> uuid4.hex

参考:

在 mysql console 里执行 sql 文件里语句

mysql> source file_name.sql

参考:

遍历一张数据表

c.execute("SELECT * FROM tbl_subscriber LIMIT %i,%i;", (actualLimit,steps))

产看表的索引

show create table <table_name>;

INT(12) 与 INT(8) 的区别

存储上无区别,主要是在终端下显示的区别。 主要是用在和 ZEROFILL 的组合使用上,用于设置显示时用于添零的长度。

参考

  • http://stackoverflow.com/questions/1632403/what-is-the-difference-when-being-applied-to-my-code-between-int10-and-int1/1632567#1632567

修改表结构

alter table tbl_name add column coln_name varchar(30) AFTER coln_name

最好的方法是使用 GUI 工具, 在图形界面上修改,将生成的语句再备份到文本里,以方 便在服务器上执行。例如,MySQL Workbench.

install MySQL on CentOS

yum install mysql-server

mysql enable remote access

/etc/mysql/my.cnf

bind-address = 127.0.0.1

各种 Join 的区别

http://stackoverflow.com/questions/38549/difference-between-inner-and-outer-joins

一行流统计 SQL

SELECT 
	NOW() AS cur_time,
	(select count(1) FROM amazon_com.categories) as total_categories,
	(select count(1) from amazon_com.items) as total_asin,
	(select count(1) from amazon_com.items where crawl_status = 1) as 'processed_items',
    (select count(1) from amazon_com.categories where processed_children = 0) as 'unprocessed_children_categories',
    (select count(1) from amazon_com.categories where status = 1) as 'processed_categories',
    (select count(1) from amazon_com.items where crawl_status = 3) as 'unfound_items',
    (select count(1) from amazon_com.items where crawl_status = 5) as 'inqueue_items',
    (select count(1) from amazon_com.items where crawl_status = 4) as 'invalid_items';

运行 MySQL 远程访问

GRANT ALL PRIVILEGES ON *.* TO 'my_user'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

生成一个新用户,允许远程访问,root 的远程访问一定要禁掉。

参考 How to allow remote connection to mysql

导出当前 MySQL 所有数据库

mysqldump -u root -p --all-databases > alldb.sql

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式