Today a customer mentioned reordering a MyISAM table to get rid of fragmentation. I asked them to clarify what they meant by reordering, assuming that they were running an OPTIMIZE or a NULL ALTER TABLE operation and they said that they use ALTER TABLE t1 ORDER BY f1, f2, f3,..etc;
Following Restore one table from an ALL database dump and Restore a Single Table From mysqldump, I would like to add my own thoughts and comments on the subject.I also wish to note performance issues with the two suggested solutions, and offer improvements.
face@mac:V:150 $ sed -n “/^– Table structure for table `mx_categories`/,/^– Table structure for table/p” wordpress_2009-12-02_02h15m.Wednesday.sql
— Table structure for table `mx_categories`
DROP TABLE IF EXISTS `mx_categories`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `mx_categories` (
`cat_ID` int(4) NOT NULL AUTO_INCREMENT,
`cat_name` varchar(55) NOT NULL DEFAULT ”,
`category_nicename` varchar(200) NOT NULL DEFAULT ”,
`category_description` text NOT NULL,
`category_parent` int(4) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`cat_ID`),
UNIQUE KEY `cat_name` (`cat_name`),
KEY `category_nicename` (`category_nicename`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
— Dumping data for table `mx_categories`
LOCK TABLES `mx_categories` WRITE;
/*!40000 ALTER TABLE `mx_categories` DISABLE KEYS */;
INSERT INTO `mx_categories` VALUES (1,’General’,’general’,”,0),(2,’Unix Notes’,’unix-notes’,”,0),(3,’AppleScript Notes’,’applescript-notes’,”,0),(4,’Misc Notes’,’misc-notes’,”,0),(5,’System Software Notes’,’system-software-notes’,”,0),(6,’Applications Notes’,’applications-notes’,”,0),(7,’Web Serving’,’web-serving’,”,0),(8,’Utilities Notes’,’utilities-notes’,”,0);
/*!40000 ALTER TABLE `mx_categories` ENABLE KEYS */;
— Table structure for table `mx_commentmeta`
With a high volume of data, this sounds like a table partitioned on day boundaries (in MySQL 5.1). See Sarah’s blog and her links for a quick ramp-up on time-based table partitioning (http://everythingmysql.ning.com/profiles/blogs/partitioning-by-dates-the). One great benefit of table partitioning is that you can drop a partition to lose millions of rows in one quick statement, much faster than deleting millions of rows. Sort of like a partial TRUNCATE TABLE.
The existence of number tables has always been a little pain. Yes, they’re very, very simple, but they need to be there. So if you just need to script some SQL query, you may find that you need to create such tables. Ummm… this means you need to have privileges (at least CREATE TEMPORARY and INSERT, if not CREATE).
In a SQL server, the data tables sit on disk. Indexes provide a means for the server to find a particular row of data in the table without having to search the entire table. When the entire table has to be searched, it's called a table scan. Most often, you want only a small subset of the data in the table, so a full table scan wastes a lot of disk I/O and therefore time.This problem is compounded when data must be joined, because many more rows must be compared between the two sides of the join.
select user_id, username, from_unixtime(user_regdate) from phpbb3_users where user_lastvisit = 0 order by user_regdate;
The REPLACE [INTO] syntax allows us to INSERT a row into a table, except that if a UNIQUE KEY (including PRIMARY KEY) violation occurs, the old row is deleted prior to the new INSERT, hence no violation.
Sounds very attractive, and has a nice syntax as well: the same syntax as a normal INSERT INTO’s. It certainly has a nicer syntax then INSERT INTO … ON DUPLICATE KEY UPDATE, and it’s certainly shorter than using a SELECT to see if a row exists, then doing either INSERT or UPDATE.
I've been asked to make some reports recently for some people in my company.
Almost all of them are quite heavy and hit the database pretty hard.
The thing is that these reports are usually generated once or twice a month, but they process a year's worth of data. Every time they are generated, they really upsets my poor production MySQL database.
I was thinking if there maybe could be a better way to just save the processed data in a table and update it every now and then.
PURGE MASTER LOGS TO ‘mydb-bin.0023’;
Then the binlog before ‘mydb-bin.0023’ will be deleted.
You may also do this:
PURGE MASTER LOGS BEFORE ‘2008-06-13 08:00:00’;